[英]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,这行代码用简单的英语做了什么:
start_at
方法...status_change?
方法和finished?
方法都评估为真在幕后,它的工作方式是将“lambda”作为参数传递给方法。 在这种情况下,它使用 Ruby 1.9 中引入的“stabby lambda”语法。 查看 Ruby 中的块、过程和 Lambda 的终极指南以及使用 Lambda 以了解更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.