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
。