sam*_*207 8 ruby methods metaprogramming class
我有以下课程
class User
attr_accessor :name, :age, :address
def initialize()
self.name = "new user"
self.age = 19
self.address = "address"
end
end
Run Code Online (Sandbox Code Playgroud)
如果要有一个方法来获取属性的指定值,我想要什么.意思是,我有另一种方法来获取上面类中的所有方法名称
methods = self.public_methods(all = false)
Run Code Online (Sandbox Code Playgroud)
我可以从中获取方法名称(我的意思是名称的getter等).我想要一种方法来传递该方法名称(我将它作为字符串)并获取方法的返回值
例如:
当我传递'name'作为方法名称时,我应该能够获得'新用户'作为值
希望我提前明白我的问题
**请注意,我必须使用这种方式,因为我的类有很多属性,并且它有很多继承的类.因此,不可能单独访问每个attr:D
Tod*_*ell 14
这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) }
Run Code Online (Sandbox Code Playgroud)
instance_variable_get如果您没有访问者方法,则使用另一个选项:
user.instance_variable_get(:@name) # => "new user"
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)