【问题标题】:Which is better to use in Rails model validation: Proc or lambda? [closed]在 Rails 模型验证中使用哪个更好:Proc 还是 lambda? [关闭]
【发布时间】: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 或其他方面认为哪个更好吗?

【问题讨论】:

    标签: ruby-on-rails ruby validation lambda proc


    【解决方案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​​ 方法。

      老实说,这两种选择都很好。

      【讨论】:

        猜你喜欢
        • 2011-01-22
        • 2021-06-09
        • 2010-10-12
        • 2011-03-05
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 2011-10-22
        相关资源
        最近更新 更多