在 Rails 模型验证中使用哪个更好:Proc 还是 lambda? [关闭]
Posted
技术标签:
【中文标题】在 Rails 模型验证中使用哪个更好:Proc 还是 lambda? [关闭]【英文标题】:Which is better to use in Rails model validation: Proc or lambda? [closed] 【发布时间】:2019-08-06 06:04:39 【问题描述】:我知道 proc 和 lambda 之间的区别。根据指南,在 Rails 模型验证中使用哪个更好:Proc 还是 lambda?
过程:
与块类似的行为。 可以存储在变量中并可以移动。 参数数量没有问题。 来自 proc 的return
将退出调用它的方法。
Lambda:
与 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 或其他方面认为哪个更好吗?
【问题讨论】:
【参考方案1】:我能想到的唯一区别是有可能使用来自 λ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
,否则 λ 是在任何地方使用的更好工具。
【讨论】:
检查 Lamba 的 arity 以调整传递的参数,捕捉返回值以及 lambda 的结果——Rails 可能正在努力使这一切成为可能。 @Stefan 我可以将参数传递给验证器吗?无论如何,我都不是 Rails 的人,而且我不使用 Rails(而且从来没有这样做过),我真的很想知道。if
proc / lambda 将使用模型的实例作为(可选)参数调用。【参考方案2】:
在实际项目中并不重要 :)
例如在我正在做的项目中:
validates :source, presence: true, if: :validated_source_field?
(使用方法)
【讨论】:
【参考方案3】:来自Ruby On Rails Guideline
,他们告诉你使用Procs
。
https://guides.rubyonrails.org/active_record_validations.html#using-a-proc-with-if-and-unless
最后,可以将 :if 和 :unless 与将被调用的 Proc 对象相关联。使用 Proc 对象使您能够编写内联条件而不是单独的方法。此选项最适合单行。
他们没有明确告诉你原因,但基于这篇文章:
https://www.rubyguides.com/2016/02/ruby-procs-and-lambdas/#Lambdas_vs_Procs
和 Alekesi 的回答,我倾向于相信 Lambda
在这种情况下会更好,因为它的行为很像 ruby 方法。
老实说,这两种选择都很好。
【讨论】:
以上是关于在 Rails 模型验证中使用哪个更好:Proc 还是 lambda? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
使用 lambda 或 proc 和 rails-money