在 Rails 模型验证中使用哪个更好:Proc 还是 lambda?
Which is better to use in Rails model validation: Proc or lambda?
我知道 proc 和 lambda 的区别。根据指南,哪个更好地用于 Rails 模型验证:Proc 或 lambda?
过程:
- 与块类似的行为。
- 可以存储在变量中并四处移动。
- 参数数量没有问题。
来自 proc 的 return
将退出调用它的方法。
拉姆达:
- 与 Proc 相同,但更接近方法。
- 严格控制它获得的参数和它需要的参数。
来自 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的早期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 方法。
老实说,两种选择都可以。
我知道 proc 和 lambda 的区别。根据指南,哪个更好地用于 Rails 模型验证:Proc 或 lambda?
过程:
- 与块类似的行为。
- 可以存储在变量中并四处移动。
- 参数数量没有问题。 来自 proc 的
return
将退出调用它的方法。
拉姆达:
- 与 Proc 相同,但更接近方法。
- 严格控制它获得的参数和它需要的参数。 来自 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的早期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 方法。
老实说,两种选择都可以。