2017-12-07 3 views
0

私はRubyオブジェクトUserを持っています。これには:first_nameメンバ変数があります。その変数に文字列でアクセスできるようにしたいと思います。Ruby:文字列でアクセスするメンバ変数(Reflection)

だから私は、ユーザーがuと呼ばれていた場合:

u.'first_name'どのように私は、変数として渡された文字列を介して、u.first_nameを取得するためにリフレクションを使用することができu.first_name

に相当すべきですか?

+1

質問が不明です。 Rubyには「メンバ変数」はありません。グローバル変数(スレッドローカルグローバル変数とメソッドローカルグローバル変数)、定数、クラス変数、インスタンス変数、ローカル変数、および疑似変数 'self'、' nil'、 'true'、および'偽です。 'u.first_name'はメッセージ送信ですが、変数とは関係ありません。 –

答えて

8

「メンバー変数」の意味は、first_nameという名前のモデルがあることです。もしそうなら、あなたは(質問はレールに焦点を当てているので、私は無地言う)「プレーン」Rubyのクラスでそれを行うだろうと、あなたは、その属性にアクセスすることができます。

class Foo 
    attr_accessor :name 
    def initialize(name) 
    @name = name 
    end 
end 

foo = Foo.new('bar') 
p foo.instance_variables   # [:@name] 
p foo.instance_variable_get '@name' # "bar" 

most idiomatic way動的にインスタンス変数を取得しますinstance_variable_getを使用している、しかし、あなたはまた、public_sendを使用して、あなたのケースで__send__、またはeven betterを使用してsend、またはより良いを使用することができます。

foo = Foo.new('bar') 
p foo.instance_variables   # [:@name] 
p foo.instance_variable_get '@name' # "bar" 
p foo.send 'name'     # "bar" 
p foo.public_send 'name'   # "bar" 

Railsは、あなたのモデルを処理し、属性の道をほぼ同じ(注されていますトンを開設o版)。モデルの1つをインスタンス化することで、必要な属性を取得できます。

user = User.first 
user.email    # [email protected] 
user.public_send 'email' # [email protected] 
関連する問題