这个 article触及问题,但没有给出解决方案。
当我想编写一个方法并可选地传递一个可以为 null 或 ????
(proc
, lambda
、方法
、block
、???)。让我们暂时称它为 block
因为 block
有效。 block
采用一个必需的参数。该方法及其调用的示例如下:
#!/usr/bin/env ruby
def foo(&proc)
puts "before"
if proc
yield "passed to proc"
end
puts "after"
end
def add_message(s)
puts "from add_message #{s}"
end
foo { |s| add_message(s) }
foo
输出是:
before
from add_message passed to proc
after
before
after
太好了。但是,我想做的是能够像这样调用 foo
:foo(&:add_message)
。但我不能。更改上面的第 15 行我得到:
before
./temp.rb:11:in `add_message': wrong number of arguments (given 0, expected 1) (ArgumentError)
from ./temp.rb:6:in `foo'
from ./temp.rb:15:in `<main>'
而且,正如上面的文章所提到的,arity 现在是 -2。那么,如何编写像 add_message
这样可以与 &:add_message
一起使用的简单方法。或者!!!就像 99.99% 的情况一样,请让我在正确的轨道上执行此操作。
最佳答案
问题是 Symbol#to_proc
没有创建正确调用 add_message
方法的proc。
# `yield` will pass its arguments to proc
>> :add_message.to_proc.call('passed to proc')
# => ArgumentError
这会调用 'passed to proc'.add_message
,因为我们的方法是在 Object
中定义的,它在 String
上调用时会起作用,但是缺少必需的参数。
解决方案是制作一个可以接受与 add_message
方法相同的参数的 proc,并将它们传递给该方法。我们可以使用 Object#method
返回 Method
对象,该对象实现了自己的 to_proc
并具有与方法相同的数量。
>> method(:add_message).to_proc.arity
=> 1
>> method(:add_message).to_proc.call('passed to proc')
from add_message passed to proc
>> foo(&method(:add_message))
before
from add_message passed to proc
after
关于ruby - 在Ruby中,如何编写一个可以与& :symbol?一起使用的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72072306/