【问题标题】:How does & work in rails?& 如何在 Rails 中工作?
【发布时间】:2016-06-30 01:43:09
【问题描述】:

在处理数组、集合或 ActiveRecord 查询时,如何在 rails 中使用 &?请提供示例及其工作原理。

到目前为止,我已经看到了使用普通数组的实现,但无法理解它是如何工作的。下面是一个简单的例子,请用它来说明你的答案。

array = [1, 2, 3, 4]

array.each do |number|
 number + 2
end

【问题讨论】:

标签: ruby-on-rails arrays collections syntax iterator


【解决方案1】:

当 Ruby 在一个对象之前遇到 & 时,它认为它是一个 Proc,所以它会在这个对象上调用 to_proc

例如,如果你有

proc_object = proc{puts 1}

&proc_object 作为参数传递给接受块的方法会在对象上调用to_proc。

这与符号:proc_object 的情况相同,因为对&:method_name 的调用与:method_name.to_proc.call 的调用相同。

在可枚举中,对象被产生给 proc,这就是为什么您可以循环遍历数组对象并打印每个元素,因为每个元素都是在循环期间产生的。

对于集合中的每个元素,都会对它们调用 proc

[1,2,4,5].map(&:to_s) # => ['1', '2', '4', '5']

这基本上将数组的每个元素都转换为字符串对象,因为数组的每个元素都生成给我的 proc。

您应该看到 &:to_s 在元素的上下文中执行,例如 5.to_s,因为该方法已经存在于元素的类等中。

如果您尝试使用未在每个元素上定义的方法来实现相同的目标,则会收到 undefined_method 错误。

在您的情况下,除非存在 add_two 方法,否则我认为这不是一个很好的例子。

示例:

{dave: :fogo, stack: :overflow, day: :today}.map(&:first) # => would return :dave, :stack, :day because for each loop through the map, an array is yielded with the first element being the key and the second the value.

[1,2,3,5,10].map(&:even?) # => [false, true, false, false, true]

数组和哈希类似于ActiveRecord的,要知道的一点是你传递的方法必须在元素的类中定义。

我希望这是有道理的。

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 2016-07-27
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多