Mic*_*ill -2 ruby testing symbols dispatch proc
我有一个方法的符号名称,我想用一些参数调用它。我真正想做的归结为以下代码片段:
method.to_proc.call(method)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,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>'
Run Code Online (Sandbox Code Playgroud)
这是一个演示此行为的自包含示例:
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
Run Code Online (Sandbox Code Playgroud)
重要的位在标记为 的块中#tests
。的data
变量是一组输入和预期结果。这些test_value_*
方法是要运行的测试的私有方法。
我试过public_send(method, value)
and method.to_proc.call(value)
,但两者都会导致private method
错误。
在这种情况下,调用名为符号的私有方法的正确方法是什么?我正在寻找解释和语法正确的答案。
使用send
来代替。
puts "#{method}: #{send(method, value) == expected_result ? 'Pass' : 'Fail'}: '#{value}'"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1008 次 |
最近记录: |