哪个更适合在Rails模型验证中使用:Proc或lambda? [关闭]

问题描述 投票:4回答:3

我知道proc和lambda之间的区别。哪个更适合根据指南在Rails模型验证中使用:Proc或lambda?

PROC:

  • 与块类似的行为。
  • 可以存储在变量中并移动。
  • 参数的数量没有问题。
  • 来自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
3个回答
8
投票

我能想到的唯一区别是可以使用λ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,否则λ是更好的工具。


1
投票

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

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

最后,可以关联:if和:除非使用将被调用的Proc对象。使用Proc对象可以编写内联条件而不是单独的方法。此选项最适合单行。

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

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

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

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


0
投票

对真正的项目无所谓:)

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

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

(使用方法)

© www.soinside.com 2019 - 2024. All rights reserved.