【问题标题】:getting variable value dynamically动态获取变量值
【发布时间】:2011-07-28 03:54:42
【问题描述】:

我有以下课程

class User
  attr_accessor :name, :age, :address

  def initialize()
    self.name = "new user"
    self.age = 19
    self.address = "address" 
  end  


end

如果有一种方法可以将分配的值分配给属性,我想要什么。意思是,我有另一种方法来获取上述类中的所有方法名称

methods = self.public_methods(all = false)

我可以从中获取方法名称(我的意思是名称等的获取器),我想要一种方法来传递该方法名称(我将其作为字符串)并获取方法的返回值

例如:

当我将“名称”作为方法名称传递时,我应该能够获得“新用户”作为值

希望我把我的问题说清楚了,提前谢谢

** 请注意,我必须使用这种方式,因为我的类有很多属性并且它有很多继承的类。因此,不可能单独访问每个 attr :D

【问题讨论】:

  • 您已经拥有由attr_accessor :name 定义的name 方法。那有什么问题?我不明白你的问题。

标签: ruby class methods metaprogramming


【解决方案1】:

这就是send 的用途:

user = User.new
user.name        # => "new user"
user.send(:name) # => "new user"

getters = user.public_methods(false).reject { |m| m =~ /=$/ }
getters.each { |m| puts user.send(m) }

如果您没有访问器方法,则使用 instance_variable_get 是另一种选择:

user.instance_variable_get(:@name) # => "new user"

使用public_methods 获取属性列表可能很危险,具体取决于您如何确定要调用的方法。相反,您可以创建自己的类方法,该方法既定义访问器又存储属性名称以供将来使用:

class User
  class << self
    attr_reader :fields

    def field (*names)
      names.flatten.each do |name|
        attr_accessor name
        (@fields ||= []) << name
      end
    end
  end

  field :name
  field :age
  field :address
end

user = User.new
user.name    = "Me"
user.age     = 22
user.address = "1234"

user.class.fields.each do |field|
  puts user.send(field)
end

【讨论】:

  • 嗨托德,使用 getters = user.public_methods(false).reject { |m| m =~ /=$/ } getters.each { |m| puts user.send(m) } 说,'堆栈级别太深'
  • 听起来你的动态调用每个访问器的代码在类本身的一个方法中,因此它自己被递归调用。由于这个原因,使用public_methods 查找属性列表可能不是一个好主意。相反,请参阅我的答案的编辑以获得更好的解决方案。
猜你喜欢
  • 2020-09-02
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 2014-06-28
  • 2013-10-23
  • 2013-11-02
  • 1970-01-01
相关资源
最近更新 更多