【问题标题】:Using symbols to reference blocks in Ruby e.g. :+, :-, :* [duplicate]在 Ruby 中使用符号来引用块,例如:+, :-, :* [重复]
【发布时间】:2015-12-23 14:43:39
【问题描述】:

我正在学习 Ruby 中符号的使用,并意识到它们主要用作对变量的引用、哈希表中的键,甚至是在方法中发送块的一种方式。

我的问题是,当我在方法中使用它们时,究竟是什么符号,例如:+:-:*

例如使用:+ 对数组中的所有值求和:

puts [1,2,3].reduce(:+) 
 => 6

给出与以下相同的结果:

puts [1,2,3].reduce {|sum, i| sum += i}
=> 6

如果我创建自己的 :+

版本
a = lambda {|sum,i| sum += i}
puts [1,2,3].reduce(&a)
=> 6

因此,我的第一个想法是 :+{|sum, i| sum += i} 引用为明确的块,但我很难找到信息来确认这一点。

【问题讨论】:

标签: ruby symbols


【解决方案1】:

传递给reduce 的符号将被解释为调用每个元素的方法的名称。所以这个

collection.reduce(:foo)

等价于这个

collection.reduce { |memo, element| memo.foo(element) }

它与 sum 一起使用的原因是 + 运算符实际上只是一个数字方法。

 1.+(3) # => 4

因此,我的第一个想法是 :+ 引用 {|sum, i| sum += i} 作为显式块

不确定你的意思,但:+ 肯定不会引用这个块。或任何块。或者任何东西。

符号只是名称。他们没有指向任何东西。决定它们的含义取决于使用它们的代码。

【讨论】:

  • 啊哈!因此,在我的示例中, .reduce 采用 :+ 符号并将其与其中一种方法相关联?感谢您的回复!
  • 是的,+ 方法将在被缩减的集合的每个元素上调用。在这种情况下,元素是实际上确实具有这种方法的数字。这不适用于 Books。
【解决方案2】:

符号不是对变量、哈希表中的键的引用,也不是您声称的发送块的方式。事实是,符号用于描述这些事物,由编写使用它们的各自方法的人设计,符号到这些事物的实际映射是在各自的方法中完成的。

对于您的特定示例,:+ 没有引用 {|sum, i| sum += i} 或任何其他块;这是reduce 的替代语法的一个特点,它允许传递一个符号,并将该符号转换为一个块。对应的block,虽然接近,但不是你想的那样,而是:{|sum, i| sum + i}

【讨论】:

  • 谢谢!现在对我来说越来越清楚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
相关资源
最近更新 更多