2011-10-04 5 views
11

存在しないメソッドを呼び出すと、method_missingはメソッドの名前を教えてくれます。設定されていない変数にアクセスしようとすると、値は単にnilになります。Rubyは定義されていないインスタンス変数に対して同等のmethod_missingを持っていますか?

私は、無関係のインスタンス変数へのアクセスを動的に傍受し、アクセスされている変数の名前に基づいて値を返しています。最も近いものはPHPの__getです。 Rubyに相当する機能はありますか?

+0

警告と警告メッセージを表示する方法について知っていますか? –

答えて

0

instance_variable_missingはありません(私が知っている以上) しかし、どうしてあなたはランダムに名前のついたインスタンス変数にアクセスしていますか?

あなたのスレッドがメソッド呼び出しを通してオブジェクト状態へのアクセスをしていれば(あなたはとにかくそうする必要があります)、これは必要ありません。

メソッドルックアップを台無しにしないで魔法のことを定義する方法をお探しの場合は、const_missingを使用します。

+0

変数にはランダムに名前が付けられません。私はテスト目的のために、インスタンス変数を設定するメーラを通らずに電子メールをレンダリングして遊んでいます。ビューは '@ user.name'のようなものにアクセスしようとします。' @ user'は設定されていません。最初の読み込み時に '@ user'のようなもののためにFactoryGirlオブジェクトを動的に生成できると思っていました。 – meagar

+0

私はありがとう。 AFAICTあなたの唯一の選択肢は、テンプレートファイルを読んでそれに応じてvarsを設定することです(あるいは、おそらく問題を回し、電子メールテンプレートで 'method_missing'を使用することです)。あなたが未定義の変数にアクセスしているときに警告を出すときにも、ルビーはそれほど恥知らずです。 – riffraff

2

私はこれがRubyでは可能ではないと思います。お勧めの方法は、テンプレート内の '' @user ''インスタンスvarではなく、 '' user ''メソッドを使うことです。

これは外部的にRubyオブジェクトを扱う方法( '' obj.user ''は '' @user ''を参照するメソッドですが、実際は '' @user ''自身ではありません)と一貫しています。属性を持つ特別なロジックが必要な場合は、オブジェクトの内側または外側からアクセスするかどうかにかかわらず、メソッド(またはmethod_missing)を使用することをお勧めします。

1

私のanswer to another similar questionを参照してください。しかし、ちょうどあなたがにできるのはなので、それはいい考えです。感覚的なデザインは、一般的に、このようなことの必要性を克服し、より読みやすく、保守可能なコードを生成することができます。

instance_variable_getは、PHPの__getに最も近いと思われます(私はPHPユーザーではありませんが)。

relevant Ruby source codeを参照すると、変数の「欠落」メソッドは、定数の場合はconst_missing、インスタンス変数の場合は唯一のものです。

+1

助けになりません。私はすべてのインスタンス変数の使用をメソッド呼び出しに変えなければなりません。これは完全に実用的ではありません。 – meagar

+0

Rubyには、他の答えで説明した以外のインスタンス変数に動的にアクセスするための機能はありません。上記の更新された回答をご覧ください。 – arcresu

関連する問題