2

メソッドを文字列として呼び出す方法を知っている人はいますか? 例えば:

case @setting.truck_identification
when "Make"
  t.make
when "VIN"
  t.VIN
when "Model"
  t.model
when "Registration"
  t.registration

.to_sym動作しないようです。

4

4 に答える 4

5

使用.send:

t.send @setting.truck_identification.downcase

(vin動作させるには小文字にする必要があります)

于 2012-12-10T22:35:31.807 に答える
2

を使用したいと思うObject#sendでしょうが、正しい大文字小文字で呼び出す必要があります。例えば:

[1,2,3].send('length')
=> 3

編集:さらに、予期しないバグにつながる悪い習慣のように思われるため、お勧めしませんが、オブジェクトがサポートするメソッドのリストを検索することで、さまざまな大文字と小文字を区別できます。

method = [1,2,3].methods.grep(/LENGth/i).first
[1,2,3].send(method) if method
=> 3

大文字と小文字を区別しない正規表現を使用してすべてのメソッドを検索し、見つかった場合は最初に返されたシンボルをオブジェクトに送信します。

于 2012-12-10T22:36:01.233 に答える
1

メソッドをグリーピングするのは、最もクリーンな方法ではありません。使うだけ#respond_to?()

method = @setting.truck_identification.downcase
if t.respond_to?(method)
    t.send(method)
end
于 2012-12-28T15:54:37.243 に答える
1

method を使用Object#sendして、メソッド名を文字列として渡すことができます。例えば:

t.send(@setting.truck_identification)

メソッドを使用して、truck_identification を正規化する必要がある場合がありますString#downcase

于 2012-12-10T22:38:18.083 に答える