【发布时间】:2015-02-07 22:46:15
【问题描述】:
我喜欢在 Ruby 中如何使用 Symbol#to_proc 将方法作为块传递:
[1.0, 2.0, 3.0].map(&:to_i)
#=> [1, 2, 3]
我还可以定义自己的 lambda times_two,并将其作为块传递:
times_two = ->(x) {x * 2}
[1, 2, 3].map(×_two)
#=> [2, 4, 6]
虽然我似乎不能将times_two 作为符号传递:
[1, 2, 3].map(&:times_two)
#=> ArgumentError: wrong number of arguments (0 for 1)
但是,当我尝试对某个方法执行相同操作时,我得到一个错误:
def times_three(x)
x * 3
end
[1, 2, 3].map(×_three)
#=> ArgumentError: wrong number of arguments (0 for 1)
[1, 2, 3].map(&:times_three)
#=> ArgumentError: wrong number of arguments (0 for 1)
我猜我不能这样做,因为times_three 是一种方法,而不是 Proc。
那么如何定义自定义方法,以便它们可以像上面第一个示例中的to_i 一样以Symbol#to_proc 的方式使用?
例如,我该怎么做?
[1, 2, 3].map(&:times_three)
#=> [3, 6, 9]
编辑:
我观看了下面发布的视频,显然您可以使用 method 方法接近 Symbol#to_proc:
def times_three(x)
x * 3
end
t_three = method(:times_three)
[1, 2, 3].map(&t_three)
#=> [3, 6, 9]
但是,它并不完全是 Symbol#to_proc:
[1, 2, 3].map(&:t_three)
#=> NoMethodError: undefined method `t_three' for 1:FixNum
【问题讨论】:
标签: ruby