gpt4 book ai didi

ruby-on-rails - 如果 : -> { status_change? && 结束了,你怎么称呼? } 在 ruby 中?

转载 作者:行者123 更新时间:2023-12-04 00:13:27 25 4
gpt4 key购买 nike

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

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

我不明白这里使用的语法...你能告诉这里 if:-> 是什么意思吗?

谢谢

最佳答案

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

Ruby 允许您将单行 if行尾的语句。前面的语句只有在 if 时才会执行。语句返回真。这些通常用于“guard clauses”。但这并不是这里发生的事情......

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

因此,该行可以重写:

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

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

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

关于条件本身,status_change?finished?也是两种方法。最后的问号是一个 Ruby 约定,表示此方法返回一个 bool 值。 &&是 bool 逻辑,当且仅当两个 status_change? 时,整个条件才会返回 true和 finished?返回真。

所以,用简单的英语来说明这行代码的作用:

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

在幕后,它的工作方式是将“lambda”作为参数传递给方法。在这种情况下,它使用了 Ruby 1.9 中引入的“stabby lambda”语法。查看 The Ultimate Guide to Blocks, Procs and LambdasUsing Lambdas in Ruby了解更多信息。

关于ruby-on-rails - 如果 : -> { status_change? && 结束了,你怎么称呼? } 在 ruby 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66272800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com