存在しないメソッドを呼び出すと、method_missing
はメソッドの名前を教えてくれます。設定されていない変数にアクセスしようとすると、値は単にnil
になります。Rubyは定義されていないインスタンス変数に対して同等のmethod_missingを持っていますか?
私は、無関係のインスタンス変数へのアクセスを動的に傍受し、アクセスされている変数の名前に基づいて値を返しています。最も近いものはPHPの__get
です。 Rubyに相当する機能はありますか?
存在しないメソッドを呼び出すと、method_missing
はメソッドの名前を教えてくれます。設定されていない変数にアクセスしようとすると、値は単にnil
になります。Rubyは定義されていないインスタンス変数に対して同等のmethod_missingを持っていますか?
私は、無関係のインスタンス変数へのアクセスを動的に傍受し、アクセスされている変数の名前に基づいて値を返しています。最も近いものはPHPの__get
です。 Rubyに相当する機能はありますか?
instance_variable_missingはありません(私が知っている以上) しかし、どうしてあなたはランダムに名前のついたインスタンス変数にアクセスしていますか?
あなたのスレッドがメソッド呼び出しを通してオブジェクト状態へのアクセスをしていれば(あなたはとにかくそうする必要があります)、これは必要ありません。
メソッドルックアップを台無しにしないで魔法のことを定義する方法をお探しの場合は、const_missing
を使用します。
変数にはランダムに名前が付けられません。私はテスト目的のために、インスタンス変数を設定するメーラを通らずに電子メールをレンダリングして遊んでいます。ビューは '@ user.name'のようなものにアクセスしようとします。' @ user'は設定されていません。最初の読み込み時に '@ user'のようなもののためにFactoryGirlオブジェクトを動的に生成できると思っていました。 – meagar
私はありがとう。 AFAICTあなたの唯一の選択肢は、テンプレートファイルを読んでそれに応じてvarsを設定することです(あるいは、おそらく問題を回し、電子メールテンプレートで 'method_missing'を使用することです)。あなたが未定義の変数にアクセスしているときに警告を出すときにも、ルビーはそれほど恥知らずです。 – riffraff
私はこれがRubyでは可能ではないと思います。お勧めの方法は、テンプレート内の '' @user ''インスタンスvarではなく、 '' user ''メソッドを使うことです。
これは外部的にRubyオブジェクトを扱う方法( '' obj.user ''は '' @user ''を参照するメソッドですが、実際は '' @user ''自身ではありません)と一貫しています。属性を持つ特別なロジックが必要な場合は、オブジェクトの内側または外側からアクセスするかどうかにかかわらず、メソッド(またはmethod_missing)を使用することをお勧めします。
私のanswer to another similar questionを参照してください。しかし、ちょうどあなたがにできるのはなので、それはいい考えです。感覚的なデザインは、一般的に、このようなことの必要性を克服し、より読みやすく、保守可能なコードを生成することができます。
instance_variable_get
は、PHPの__get
に最も近いと思われます(私はPHPユーザーではありませんが)。
relevant Ruby source codeを参照すると、変数の「欠落」メソッドは、定数の場合はconst_missing
、インスタンス変数の場合は唯一のものです。
警告と警告メッセージを表示する方法について知っていますか? –