我有一个Ruby对象User,它有一个:first_name成员变量。我希望能够使用字符串访问该变量。
所以,如果我有一个名为u的用户:
u.'first_name'
应相当于u.first_name
我如何使用反射来通过字符串获取u.first_name,该字符串作为变量传入?
答案 0 :(得分:9)
我认为你对“成员变量”的意思是,你有一个名为first_name
的属性的模型。如果是这样,那么您可以像在“普通”中那样访问该属性(“普通”,因为问题集中在Rails上)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
,但您也可以使用send
,或者更好地使用__send__
或even better您的案例使用public_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处理模型和属性的方式几乎相同(注意:打开版本)。通过实例化您的某个模型,您可以获得所需的属性:
user = User.first
user.email # email@mail.com
user.public_send('email)' # email@mail.com