1

関数と引数で構成される式を評価する方法を見つけようとしています。問題は、引数を文字列に変換したくないということです。

具体的には、Time 型のオブジェクト y を取る String 型の関数 x="display_datetime" があります。関数名は動的に作成されるため、display_datetime(y) とだけ入力することはできません。

私が試したこと:

  • eval("#{x}(#{y})") - これは私が通常行う方法ですが、これは Time を文字列に変換します。「display_datetime」の全体的な目的は、カスタム時刻から文字列への変換を行うことなので、これは役に立ちません

  • x.send(y) - send は関数の引数ではなく、クラス関数を送信するためのものであるため、これはコンパイルされません。

  • x.constantize ... - x にクラス名が含まれていてもコンパイルされません。

  • y.send(:to_s(:datetime))このアプローチは理想的とは言えませんが、まだ機能させることはできません。display_datetime は y.to_s(:datetime) を呼び出すだけなので、動的に生成された関数名 x を単純に .to_s(:datetime) に設定してから、send コマンドで y に対して x を呼び出してみました。to_s が引数を取るという事実を除いて、これは機能します。送信される引数が引数を取る必要がある場合に send (または try) を呼び出す方法がわかりません
  • 私が持っていた別のアイデアは、Time クラスをオーバーライドして to_s のような変換関数を追加することですが、これには引数がありません。

これらの最後の 2 つのアプローチは理想的とは言えません。最初の 3 つのアプローチに沿って、これを行うにはもっと良い方法が必要だと思います。

フィードバックをお待ちしております。

ありがとう

4

2 に答える 2