2017-12-27 919 views
1

对于数组中的元素回应,我可以做红宝石适用看跌数组

[1,2,3].each(&:to_s) 

方法,但对于:

[1,2,3].each {|i| puts i} 

我不能这样做:

[1,2,3].each(&:puts) 

如何优雅地将Kernel方法(如puts)应用于数组中的对象?会不会有Rubyish的方式?

+10

你的最后一个例子对我来说似乎很红宝石...... – maerics

+4

'puts [1,2,3]'? –

回答

4

puts是一种方法,在定义Kernel将其转换为proc,使用:

[1,2,3].each(&method(:puts)) 

Symbol#to_proc有特定的含义,基本上本身发送到接收器。

有人可能的任何方法转化为proc通过它来阻止:

%w[1 2 3].map(&method(:Integer)) 
#⇒ [1, 2, 3] 
+0

谢谢。正是我在找什么。现在,我只需要等10分钟,然后SO就可以将其标记为“答案” –

+0

为了让其他人更好地了解这个问题,在这种情况下,前导'&'是通过对象的参数将参数转换为块'to_proc'方法。例如'&:to_s'(问题是'Symbol#to_proc')和'&method(:puts)'(如答案中)是'Method#to_proc'。对于'Symbol#to_proc',将'Symbol'发送到block参数,其中'Method#to_proc'将block参数发送给'Method' – engineersmnky

+3

这很整洁,除了我认为OP的最后一个例子更具惯用性,更多重要的是,比这些例子更容易理解...... – maerics

5

你的最后一个例子是惯用的红宝石:

[1,2,3].each { |x| puts x } 

当然,还有其他方法可以做到同样的事情,但上面的代码很简单,任何Rubyist都很容易理解。

+0

这永远不会通过我的CR。 Ruby被发明是语法加糖的,它应该具有糖语言的使用能力。 – mudasobwa

+2

@mudasobwa我想我们在这里有不同的看法 - 对我来说,简单和清晰比糖更重要。 – maerics

+1

从来不是一个强大的词。国际海事组织,编程中很少有东西应该使用从不或永远的话。我必须同意@maerics这个。代码是写的,是的;但最终,代码是要读取的。它是由你未来的自己和下一个必须维护你的代码的人阅读的。 –