【发布时间】:2016-09-09 03:57:45
【问题描述】:
我有一个方法的符号名称,我想用一些参数调用它。我真正想做的归结为这段代码sn-p:
method.to_proc.call(method)
在这种情况下,method 是对象上的方法的符号名称。在我的例子中,我试图调用一个恰好在对象上是私有的方法。
这是我得到的错误输出:
>$ ruby symbol_methods.rb
symbol_methods.rb:33:in `call': private method `test_value_1' called for "value":String (NoMethodError)
from symbol_methods.rb:33:in `block (2 levels) in <main>'
from symbol_methods.rb:30:in `each'
from symbol_methods.rb:30:in `block in <main>'
from symbol_methods.rb:29:in `each'
from symbol_methods.rb:29:in `<main>'
这是一个演示此行为的独立示例:
data = [
["value", true],
["any value here", true],
["Value", true],
]
def matches_value(string)
string == "value"
end
def contains_value(string)
string.gsub(/.*?value.*?/, "\\1")
end
def matches_value_ignore_case(string)
string.downcase == "value"
end
#tests
[:matches_value, :contains_value, :matches_value_ignore_case].each_with_index do |method, index|
test = data[index]
value = test[0]
expected_result = test[1]
result = method.to_proc.call(value) # <<== HERE
puts "#{method}: #{result == expected_result ? 'Pass' : 'Fail'}: '#{value}'"
end
重要的位在标记为#tests 的块中。 data 变量是一组输入和预期结果。 test_value_* 方法是私有方法,是要运行的测试。
我尝试过public_send(method, value) 和method.to_proc.call(value),但都导致private method 错误。
在这种情况下,调用名为符号的私有方法的正确方法是什么?我正在寻找解释和语法正确的答案。
【问题讨论】:
标签: ruby testing symbols proc dispatch