Ruby 对参数使用proc速记

Ruby 对参数使用proc速记,ruby,Ruby,是否有一种方法可以使用普通参数为块参数创建符号和语法快捷方式?一个具体的例子: def ewa_test(x, o) if o.include? x o << "more #{x}" else o << x end end fridge_contents = %w( pepperoni green_onions mushrooms olives chives ) # shortcut for calling upcase on every

是否有一种方法可以使用普通参数为块参数创建符号和语法快捷方式?一个具体的例子:

def ewa_test(x, o)
  if o.include? x
    o << "more #{x}"
  else
    o << x
  end
end

fridge_contents = %w( pepperoni green_onions mushrooms olives chives )

# shortcut for calling upcase on every element
# returns ["PEPPERONI", "GREEN_ONIONS", "MUSHROOMS", "OLIVES", "CHIVES"]
fridge_contents.map(&:upcase)

# same shortcut to call ewa_test on every element
fridge_contents.each_with_object([]) { |x, o| ewa_test(x, o) }

# obviously without an object argument, each_with_object raises ArgumentError
fridge_contents.each_with_object(&:ewa_test)

# each raises NoMethodError: private method `ewa_test' called for "pepperoni":String
fridge_contents.each_with_object([], &:ewa_test)

# syntax error
fridge_contents.each_with_object(&:ewa_test, [])
def-ewa_测试(x,o)
如果包括在内?x

o这里您的思路是正确的,但是请记住,
&:x
符号表示迭代器特有的内容,如
map

a.map(&:x)
相当于:

a.map { |o| o.send(:x) }
a.map { |o| o.x }
这相当于:

a.map { |o| o.send(:x) }
a.map { |o| o.x }
没有提供多个参数的规定。在您的情况下,您需要这样做:

fridge_contents.each_with_object([], &method(:ewa_test))

其中
method(:x)
返回一种调用非对象特定的任意方法的方法。

您在这里的思路是正确的,但请记住
&:x
表示法意味着特定于迭代器的某种东西,如
map

a.map(&:x)
相当于:

a.map { |o| o.send(:x) }
a.map { |o| o.x }
这相当于:

a.map { |o| o.send(:x) }
a.map { |o| o.x }
没有提供多个参数的规定。在您的情况下,您需要这样做:

fridge_contents.each_with_object([], &method(:ewa_test))

其中
method(:x)
返回一种调用非对象特定的任意方法的方法。

从读取文档来看,method#to#proc和Symbol#to#proc应该具有相同的结果,但Symbol版本似乎返回一个lambda。我试图完全理解这个答案,但失败了,但这是值得的。从阅读文档来看,方法#to#u proc和符号#to#u proc应该有相同的结果,但符号版本似乎返回一个lambda。我尝试过,但未能完全理解这个答案,但这是值得的努力。