我知道proc和lambda之间的区别。哪个更适合根据指南在Rails模型验证中使用:Proc或lambda?
PROC:
return
将退出调用它的方法。LAMBDA:
return
将退出lambda,并且调用它的方法将继续执行。但我还没有看到它产生影响的验证:
validates :name, present: true, if: -> { assotiation.present? }
validates :name, present: true, if: proc { |c| c.assotiation.present? }
我检查了rubocop并没有找到任何关于它的建议。你知道ruby / rails风格指南,rubocop或其他东西哪个更好?
我能想到的唯一区别是可以使用λs的早期回报。也就是说,前者会愉快地验证,而后者会提高LocalJumpError
:
validates :name, present: true,
if: -> { return false unless assotiation; assotiation.present? }
validates :name, present: true,
if: proc { return false unless assotiation; assotiation.present? }
另外,我使用以下经验法则:严格要比宽敞要好。所以,除非你绝对明确需要一个proc
,否则λ是更好的工具。
来自Ruby On Rails Guideline
,他们告诉你使用Procs
。
https://guides.rubyonrails.org/active_record_validations.html#using-a-proc-with-if-and-unless
最后,可以关联:if和:除非使用将被调用的Proc对象。使用Proc对象可以编写内联条件而不是单独的方法。此选项最适合单行。
他们没有明确告诉你原因,但基于这篇文章:
https://www.rubyguides.com/2016/02/ruby-procs-and-lambdas/#Lambdas_vs_Procs
和Alekesi的回答,我倾向于相信在这种情况下Lambda
会更好,因为它的行为很像红宝石方法。
老实说,两种选择都很好。
对真正的项目无所谓:)
例如,在我的项目上,我这样做:
validates :source, presence: true, if: :validated_source_field?
(使用方法)