在 Rails 模型验证中使用哪个更好:Proc 还是 lambda?

Which is better to use in Rails model validation: Proc or lambda?

我知道 proc 和 lambda 的区别。根据指南,哪个更好地用于 Rails 模型验证:Proc 或 lambda?

过程:

拉姆达:

但我还没有看到它产生影响的验证:

validates :name, present: true, if: -> { assotiation.present? }
validates :name, present: true, if: proc { |c| c.assotiation.present? }

我检查了 rubocop,但没有找到任何关于它的建议。你知道 ruby/rails 风格指南、rubocop 或其他什么更好吗?

我能想到的唯一区别是有可能使用来自λs的早期returns。也就是说,前者会很乐意验证,而后者会提出 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,否则 λ 是更好的工具,可以在 无处不在 .

在实际项目中无关紧要:)

例如,在我的项目中,我是这样做的:

validates :source, presence: true, if: :validated_source_field?

(使用方法)

来自Ruby On Rails Guideline,他们告诉你使用Procs

https://guides.rubyonrails.org/active_record_validations.html#using-a-proc-with-if-and-unless

Finally, it's possible to associate :if and :unless with a Proc object which will be called. Using a Proc object gives you the ability to write an inline condition instead of a separate method. This option is best suited for one-liners.

他们没有明确告诉你原因,但基于这篇文章:

https://www.rubyguides.com/2016/02/ruby-procs-and-lambdas/#Lambdas_vs_Procs

和 Alekesi 的回答,我倾向于相信 Lambda 在这种情况下会更好,因为它的行为很像 ruby 方法。

老实说,两种选择都可以。