gpt4 book ai didi

ruby - Symbol#to_proc 自定义方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:15:09 26 4
gpt4 key购买 nike

我喜欢在 Ruby 中如何将方法作为 block 传递,就像这样使用 Symbol#to_proc:

[1.0, 2.0, 3.0].map(&:to_i)
#=> [1, 2, 3]

我还可以定义自己的 lambda,times_two,并将其作为 block 传递:

times_two = ->(x) {x * 2}

[1, 2, 3].map(&times_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(&times_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

最佳答案

class Integer
def times_three
return self * 3
end
end

现在,因为 times_three 现在是 Integer 类的一个方法,您可以执行符号处理...

[1, 2, 3].map(&:times_three)

如果要访问不属于对象类但作用于对象的方法,则需要将对象作为参数传递给方法...

def times_three(x)
x * 3
end

[1, 2, 3].map{|i| times_three(i) }

symbol to proc 需要使用对象作为接收者。

[1, 2, 3].map(&:some_action)

相当于

[1, 2, 3].map{|i| i.some_action}

关于ruby - Symbol#to_proc 自定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28388368/

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