我有以下课程
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