我知道proc和lambda之间的区别。根据以下准则,在Rails模型验证中使用哪种更好:Proc或lambda?
过程:
return
来自proc会退出调用它的方法。Lambda:
return
从lambda中退出将退出lambda,并且调用它的方法将继续执行。但是我还没有看到能使它有所作为的验证:
validates :name, present: true, if: -> { assotiation.present? }
validates :name, present: true, if: proc { |c| c.assotiation.present? }
我检查了rubocop,但没有找到任何建议。您知道在ruby / rails样式指南,rubocop或其他工具中哪个更好?
答案 0 :(得分:8)
我唯一能想到的区别是使用λ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
,否则λ是使用无处不在的更好工具。
答案 1 :(得分:1)
他们从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
在这种情况下会更好,因为它的行为非常类似于ruby方法。
老实说,两个选项都很好。
答案 2 :(得分:0)
与实际项目无关紧要:)
例如,在我的项目中,我这样做:
validates :source, presence: true, if: :validated_source_field?
(使用方法)