mik*_*416 2 ruby-on-rails callback
我正在学习 Ruby on Rails,在处理概念的同时,我也在处理语法,这在您开始 RoR 时有点奇怪。根据 Michael Hartl 的教程
当哈希是函数调用的最后一个参数时,大括号是可选的
我明白,但是当作者提到回调时,出现了这行代码:
before_save { self.email = email.downcase }
Run Code Online (Sandbox Code Playgroud)
我理解 before_save 是方法。有人可以为我分解一下论点吗?为什么你不能把大括号去掉?
您的代码中没有哈希值。您正在查看的是一个块,它是一种匿名函数。Ruby 有两种不同的块语法。这段代码:
before_save { self.email = email.downcase }
Run Code Online (Sandbox Code Playgroud)
...相当于此代码:
before_save do
self.email = email.downcase
end
Run Code Online (Sandbox Code Playgroud)
一般情况下,花括号用于单行,do ... end用于多行。无论哪种情况,您所做的都是定义一个“代码块”,然后将其作为参数传递给该before_save方法。这允许 Rails 将该代码块存储在一个变量中并稍后执行,或者将代码传递给其他方法。上面的两个例子在很大程度上等价于这个:
my_block = proc do
self.email = email.downcase
end
before_save(&my_block)
Run Code Online (Sandbox Code Playgroud)
块参数是特殊的。一个方法只能有一个块参数,并且它必须是最后一个参数。在我使用的最后proc一段代码( 的快捷方式Proc.new)中,实际上是将一个块保存到一个变量中,然后将该变量before_save作为参数传递给。该&告诉红宝石,它应该把该PROC作为块参数before_save。
不过,有一些语法问题会随着块出现。例如,这是有效的:
[ "two", "three" ].reduce "one" do |memo, item|
memo << item
end
# => "onetwothree"
Run Code Online (Sandbox Code Playgroud)
但这不是:
[ "two", "three" ].reduce "one" {|memo, item| memo << item }
# => SyntaxError: unexpected '{', expecting end-of-input
Run Code Online (Sandbox Code Playgroud)
当您使用花括号语法并有参数("one"如上)时,您必须使用括号:
[ "two", "three" ].reduce("one") {|memo, item| memo << item }
# => "onetwothree"
Run Code Online (Sandbox Code Playgroud)
除了块和 Procs,Ruby 有一种特殊的 Proc,称为 lambda。你会在一些 Rails 文档中看到 lambdas,它们看起来像这样:
scope :published, -> { where(published: true) }
Run Code Online (Sandbox Code Playgroud)
这是一个快捷方式:
scope :published, lambda { where(published: true) }
# ...or...
scope :published, lambda do
where(published: true)
end
Run Code Online (Sandbox Code Playgroud)
...这些都等价于:
my_lambda = ->{ where(published: true) }
scope :published, my_lambda
Run Code Online (Sandbox Code Playgroud)
注意第二行没有&before my_lambda。这是因为 Rails 的开发人员选择 makescope将 lambda 作为常规参数而不是它的块参数,我认为主要是,所以它不必是最后一个参数。
块、过程和 lambdas 之间的差异超出了这个答案的范围,有时很微妙,但这是很好的知识。我推荐这篇文章以获取更多信息:https : //rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/18-blocks/lessons/64-blocks-procs-lambdas
| 归档时间: |
|
| 查看次数: |
760 次 |
| 最近记录: |