我有一个嵌套数组:
a = [[1, "Aldous Huxley"],
[3, "Sinclair Lewis"],
[2, "Ernest Hemingway"],
[4,"Anthony Burgess"]]a.collect { |author| author.drop(1) }
输出
[["Aldous Huxley"], ["Sinclair Lewis"], ["Ernest Hemingway"], ["Anthony Burgess"]]而
a.collect(&:drop(1))
给了我一个罪恶的错误。
SyntaxError: (irb):18: syntax error, unexpected '(', expecting ')'
a.collect(&:drop(1))
^可以用&:语法定义我的原始块表达式吗?
发布于 2017-09-17 09:31:36
冒号是Ruby中符号的一部分,通过调用对象上的to_proc并将其作为块使用,&是使该语法工作的神奇之处。因此,虽然不能使用像:drop(1)这样的符号,但是可以通过两种方式实现这一点而不需要使用符号:
1)从方法中返回proc并将其传递给:
def drop(count)
proc { |instance| instance.drop(count) }
end
a.collect(&drop(1))2)传入响应to_proc的对象
class Drop
def initialize(how_many = 1)
@to_drop = how_many
end
def to_proc
proc { |instance| instance.drop(@to_drop) }
end
end
drop = Drop.new(1)
a.collect(&drop) # or, more succinctly
a.collect(&Drop.new(1))在这样一个简单的例子中,定义返回响应to_proc的过程或对象的方法可能是过分的,只将一个块传递给collect更好,但是可能有一些用例没有。
更新:考虑到这一点,Symbol类没有call方法,但这并不意味着它不能:
module SymbolCall
def call(*args)
proc { |instance| instance.public_send(self, *args) }
end
end
class Symbol
include SymbolCall
end
a.collect(&:drop.(1)) # or
a.collect(&:drop.call(1))请确保不要忘记,它实际上是一个名为:drop.(1) 而不是 :drop(1)的方法。
发布于 2017-09-17 09:02:03
不,这不可能。
&语法是语法糖,它实际上是这样做的:
Proc实例,并对其调用to_proc;(&:foo)之所以有效,是因为Symbol.to_proc存在。
(&:foo(arg))只是不能被解析,因为:需要后面的有效符号字符,并且打开括号会引发语法错误。
https://stackoverflow.com/questions/46262302
复制相似问题