加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 动态获取变量值

发布时间:2020-12-16 19:23:35 所属栏目:百科 来源:网络整理
导读:我有以下课程 class User attr_accessor :name,:age,:address def initialize() self.name = "new user" self.age = 19 self.address = "address" end end 如果要有一个方法来获取属性的指定值,我想要什么.意思是,我有另一种方法来获取上面类中的所有方法名
我有以下课程
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’作为方法名称时,我应该能够获得’新用户’作为值

希望我提前澄清问题

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

解决方法

这就是发送的目的:
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读