在 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? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Rails 还是 Grails? [关闭]

如何判断哪个 Keras 模型更好?

使用 lambda 或 proc 和 rails-money

Rails 3 UJS Ajax 模式/策略,哪个更好?

是否可以在 Rails 模型验证方法中执行一些 Javascript?

在 Rails 模型中一起验证日期和时间字段