Ruby:使用字符串访问成员变量(反射)

时间:2017-12-07 13:00:03

标签: ruby-on-rails ruby reflection

我有一个Ruby对象User,它有一个:first_name成员变量。我希望能够使用字符串访问该变量。

所以,如果我有一个名为u的用户:

u.'first_name'应相当于u.first_name

我如何使用反射来通过字符串获取u.first_name,该字符串作为变量传入?

1 个答案:

答案 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