Ruby 有没有可能更简洁地表达'stuff.map{| x | puts x}`呢?

Ruby 有没有可能更简洁地表达'stuff.map{| x | puts x}`呢?,ruby,map,block,Ruby,Map,Block,我想用一些速记来表达以下几点: stuff.map {|x| puts x} 对这样的事情: stuff.map {puts} puts [1, 2, 3].map(&:to_s) 我搞不懂语法。有人能告诉我怎么做吗?根据: 返回枚举数。您还可以执行以下操作: puts a.map(&:to_s) 打印每个元素。您需要一个接收器 的块格式返回一个数组,因此您仍然需要一个接收器(如Kernel,using)将每个元素发送到标准输出。你可以这样做: stuff.map {pu

我想用一些速记来表达以下几点:

stuff.map {|x| puts x}
对这样的事情:

stuff.map {puts}
puts [1, 2, 3].map(&:to_s)
我搞不懂语法。有人能告诉我怎么做吗?

根据:

返回枚举数。您还可以执行以下操作:

puts a.map(&:to_s)
打印每个元素。

您需要一个接收器 的块格式返回一个数组,因此您仍然需要一个接收器(如Kernel,using)将每个元素发送到标准输出。你可以这样做:

stuff.map {puts}
puts [1, 2, 3].map(&:to_s)

但这肯定不会使事情变得更短或更清楚。也许你应该重新审视你真正想要实现的东西。

也许你暗示的是
map(&:method)
语法,但在
put
的情况下,这是不可能的

在引擎盖下,Ruby调用符号上的_proc。该方法的主体是:

def to_proc
  proc { |obj, *args| obj.send(self, *args) }
end
在您的例子中,obj是
stuff
,self是
put


正如您所理解的,
stuff
不响应
put
方法,因此您不能在当前表达式中使用符号构造。

因为您有一个数组,所以您可以直接编写

puts stuff
但是,一般来说,您可以向字符串或对象添加一个方法,然后直接将该方法传递给
可枚举对象。
由于
Symbol
有一个
to_proc
方法,您可以在不需要块的情况下调用该方法

class Object; def myputs; puts self; nil; end; end

stuff.each &:myputs # or, even better, ...

stuff.myputs

虽然已经关闭,但我建议:

stuff.map(&Kernel.method(:puts))

首先:在这里使用
map
是没有意义的,因为您不是在做一个映射操作,而是一个简单的副作用迭代。这正是每个的目的。使用
map
只会让未来的维护人员(包括您自己)感到困惑

每个
映射
取一个块。可以使用一元前缀
&
运算符将响应
to_proc
的任何对象转换为块。谢天谢地,
Method
s确实对
做出了响应,因此您可以直接传递要调用的方法:

stuff.each(&method(:puts))
但是,如果
stuff
是一个
Array
,则有一个更简单的方法,因为
特殊情况
Array
放在一起,以精确执行您正在执行的操作。因此,您的代码100%等同于

puts stuff

你想做什么?当你说“更简洁地表达一些东西”时,这是一个应该被问到的线索。请阅读该站点,尤其是“我很困惑!这个站点的主题有哪些问题?”因为没有人提到它-在这里使用
map
是完全多余的,所以在控制台中使用
每个
map更好,因为它返回空值。每个都将返回使控制台混乱的对象output@rsoni如果
Enumerable#map
返回nil,我们将遇到各种麻烦,这将返回一个字符串数组。它不会将输出发送到任何地方。我经常使用它来在控制台中更清楚地阅读内容,所以我只想要一个较短的版本,因为我经常键入它。我知道在javascript中这可以做得更简洁,只是想尝试在ruby中做同样的
[1,2,3]。map(&:to_s)
将在REPL上返回
[“1”,“2”,“3”]
,这听起来像是您想要的。然而,它不会像puts那样直接将其发送到标准输出——它看起来是这样的,因为IRB/Pry默认情况下会将返回值显示为read-eval-print循环的一部分。啊,好的一点,因为puts无疑会在其参数上调用
#to_s