繁体   English   中英

如果:-> { status_change? && 完成的? 在 ruby 中?

[英]What do you call if: -> { status_change? && finished? } in ruby?

我是 ruby 的新手。 在 ruby_on_rails 项目中,我在模型的 rb 文件中找到以下代码

...    
before_validation :start_at, if: -> { status_change? && finished? }
...

我不明白这里使用的语法......你能说出if:->在这里的意思吗?

谢谢

哇,你的问题有很多...

Ruby 允许您将单行if语句放在行尾。 仅当if语句返回 true 时才执行前面的语句。 这些通常用于“ 保护条款”。 但这并不是这里发生的事情......

如果 Ruby 可以准确推断出参数是什么,您还可以在方法调用周围去掉括号。 您可以输入sum a, b ,而不是输入sum(a, b) 这是使 Ruby 非常适合编写像 Rake 和 ActiveRecord 部分的“领域特定语言”的原因之一。 Thoughtbot 有一篇关于它们的好文章

因此,该行可以重写:

before_validation(:start_at, if: -> { status_change? && finished? })

在这种情况下, before_validation 是一个ActiveRecord 回调 从该链接中,“回调是在对象生命周期的某些时刻被调用的方法。通过回调,可以编写在 Active Record object 被创建、保存、更新、删除、验证或加载时运行的代码数据库。”

在这种情况下,您拥有的是“ 条件回调”。 start_at方法(您可能会在 model 文件的底部找到定义,或者在其他地方,在代码库中搜索“def start_at”)只有在条件通过时才会被调用。

关于条件本身, status_change? finished? 也是两种方法。 最后的问号是 Ruby 约定,表示此方法返回 boolean。 &&是 Boolean 逻辑表示当且仅当两个status_change? finished? 返回真。

因此,对于 state,这行代码用简单的英语做了什么:

  • 在 ActivRecord 检查 model 是否有效之前
  • 运行start_at方法...
  • ...但前提是status_change? 方法和finished? 方法都评估为真

在幕后,它的工作方式是将“lambda”作为参数传递给方法。 在这种情况下,它使用 Ruby 1.9 中引入的“stabby lambda”语法。 查看 Ruby 中的块、过程和 Lambda 的终极指南以及使用 Lambda 以了解更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM