我喜欢如何在Ruby中,你可以通过方法为块,像这样使用Symbol#to_proc
:与自定义方法符号#to_proc
[1.0, 2.0, 3.0].map(&:to_i)
#=> [1, 2, 3]
我也可以定义自己的拉姆达,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
方法去接近符号#to_proc:
def times_three(x)
x * 3
end
t_three = method(:times_three)
[1, 2, 3].map(&t_three)
#=> [3, 6, 9]
但是,它不是相当符号#to_proc:
[1, 2, 3].map(&:t_three)
#=> NoMethodError: undefined method `t_three' for 1:FixNum
非常感谢这个清晰的解释,史蒂夫。现在我知道如何做到这一点,是否可以接受的做法是用这种方法来修补核心类以清理复杂或重复的块? – garythegoat 2015-02-08 00:07:00
嗯,是的,只要意图清楚,并有好处,猴子补丁肯定没问题。 本周我有一个rails应用程序,其中强制性输入字段在标签中有星号,例如, “'名字*''和''城市*'',企业突然想要所有的星号变成红色的字体颜色。我可以写一个像red_asterisk('First Name *')这样的辅助方法,但是更容易的方法是修改String类的First Name * red_asterisk然后在'*'上执行全局查找/替换操作。 ''所以它变成了'*'。red_asterisk' – SteveTurczyn 2015-02-08 00:23:11
史蒂夫,正如你所知道的那样,'return'是不需要的。然而,“自我”是。我假设'self'必须是明确的,例如'*','%'等方法都是用语法糖调用的。你或其他人知道这是否属实? – 2015-02-08 04:39:59