【问题标题】:Ruby: Access member variable with string (Reflection) [closed]Ruby:使用字符串访问成员变量(反射)[关闭]
【发布时间】:2018-05-21 14:22:24
【问题描述】:

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

所以如果我有一个叫你的用户:

u.'first_name' 应该等价于u.first_name

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

【问题讨论】:

  • 您的问题不清楚。 Ruby 中没有“成员变量”之类的东西。只有全局变量(还有线程局部全局变量和方法局部全局变量)、常量、类变量、实例变量、局部变量和伪变量selfniltrue和@ 987654326@。 u.first_name是消息发送,与变量无关。

标签: ruby-on-rails ruby reflection


【解决方案1】:

我认为你所说的“成员变量”是指你有一个模型,它有一个名为first_name 的属性。如果是这样,那么您可以像在“plain”(“plain”,因为问题集中在 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

【讨论】:

    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多