在 Ruby 中按符号名称调用私有方法

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错误。

在这种情况下,调用名为符号的私有方法的正确方法是什么?我正在寻找解释和语法正确的答案。

del*_*lta 5

使用send来代替。

puts "#{method}: #{send(method, value) == expected_result ? 'Pass' : 'Fail'}: '#{value}'"
Run Code Online (Sandbox Code Playgroud)