ruby - 动态获取变量值

标签 ruby class methods metaprogramming

我有以下类(class)

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)

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

例如:

当我将“name”作为方法名称传递时,我应该能够获得“new user”作为值

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

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

最佳答案

这就是 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

关于ruby - 动态获取变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5521740/

相关文章:

ruby-on-rails - 有没有类似 Ruby On Rails 的 Xampp?

ruby - 有没有一种方法可以只删除 1 个匹配的数组元素?

c# - 是否有必要在 C# 中至少有一个类

javascript - 定义数组对象属性

dom - Vue.js 方法与计算属性。它们如何与 DOM 交互

java - 将对象从一个类移动到另一个类 (Java)

ruby - 如何摆脱 Haml & Ruby 渲染的 html 中的多余空格?

ruby-on-rails - 使用 Ruby ActiveRecord 选择和更新多行

c++ - 试图将复杂数组存储到类 C++ 中

ruby-on-rails - Ruby on Rails 显示 Action 在 Controller 中不起作用