私はいくつかの引数で呼びたいメソッドのシンボル名のリストを持っています。これは、私が構築しようとしている単純な比較テストのためのものです。ここではテストのために不可欠なコードは次のとおりです。Ruby - シンボル変数で指定されたメソッドを呼び出す
data = [
["value", true],
["any value here", true],
["Value", true],
]
def test_value_1(string)
string == "value"
end
def test_value_2(string)
string.gsub(/.*?value.*?/, "\\1")
end
def test_value_3(string)
string.downcase == "value"
end
#tests
[:test_value_1, :test_value_2, :test_value_3].each do |method|
data.each do |test|
value = test[0]
expected_result = test[1]
puts "#{method}: #{method.to_proc.call(value) == expected_result ? 'Pass' : 'Fail'}: '#{value}'"
end
end
重要なビットが#tests
コメント以下、エンドブロックです。 data
とtest_value_*
メソッドは、テストブロックの使用方法の単なる例であり、本質的な意味を持たないため、それらを掘り起こす必要はありません。
私が本当にやろうとしているが、このコードスニペットに沸く:
method.to_proc.call(value)
そして、この場合には、value
は直接グローバル名前空間内のメソッドのシンボル名(ない方法でありますオブジェクト)。
これは私が取得エラー出力です:私は困惑
>$ 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>'
。私はpublic_send(method, value)
とmethod.to_proc.call(value)
を試しましたが、どちらもprivate method
というエラーになります。
この場合、シンボルと呼ばれるメソッドを呼び出す正しい方法は何でしょうか?私は説明と構文的に正しい答えの両方を探しています。
@mudasobwaここでのポイントは、プライベートメソッドを呼び出すことです。 'public_send'は正確に動作しないものです。 – sawa
@sawaああ、本当に、すみません。 – mudasobwa
@deltaこれはsend(method、value == expected_result? 'Pass': 'Fail') 'と同じです。' send(method、value)== expected_result? 「合格」:「失敗」。敬虔は問題です。 –