我创建了一个Patient
有名称等的应用程序。
class Patient
attr_accessor :vorName
def initialize (vorname, name, alter)
@vorname = vorname
@name = NameName
@alter = alterr
end
我创造了两名患者:
a = Patient.new('jonas', 'leiti', '25.02.95')
b = Patient.new('emanuel','stadler', '59.09.91')
我不知道如何得到所有患者的vorname
。我试过这样的事情:
Patient.each do
puts vorname
end
答案 0 :(得分:2)
看看这个方法 - ObjectSpace#each_object
class Patient
attr_accessor :vorname
def initialize (vorname, name, alter)
@vorname = vorname
@name = name
@alter = alter
end
end
a = Patient.new('jonas', 'leiti', '25.02.95')
b = Patient.new('emanuel','stadler', '59.09.91')
ObjectSpace.each_object(Patient) {|x| p x.vorname }
# >> "emanuel"
# >> "jonas"
答案 1 :(得分:2)
真正的重点是:为什么不在创建时存储它们的数组?而不是:
a = Patient.new('jonas', 'leiti', '25.02.95')
b = Patient.new('emanuel','stadler', '59.09.91')
做的:
arr = []
arr << Patient.new('jonas', 'leiti', '25.02.95')
arr << Patient.new('emanuel','stadler', '59.09.91')
然后您可以使用以下方式访问它们:
arr.each do |x|
puts x.vorname
end
一个好的经验法则是:
除非绝对必要,否则不要使用反射/内省。
肯定不是这样。
注意:attr_accessor :vorName
应为attr_accessor :vorname
。
答案 2 :(得分:0)
您的代码包含一些拼写错误。我编辑了你的代码如下。
class Patient
attr_accessor :vorname
@@patients = []
def self.patients
@@patients
end
def initialize (vorname, name, alter)
@vorname = vorname
@name = name
@alter = alter
@@patients.push self
end
end
a = Patient.new('jonas', 'leiti', '25.02.95')
b = Patient.new('emanuel','stadler', '59.09.91')
Patient.patients.each do |patient|
puts "vorname: #{patient.vorname}"
end
答案 3 :(得分:0)
改变这个:
Patient.each do
puts vorname
end
为此:
Patient.all.each do |patient|
puts patient.vorname
end
它也可以作为oneliner:
Patient.all.each{|patient| puts patient.vorname}
修改强>
正如Priti在评论中说的那样,这是没有轨道(我的不好,如果你使用的是导轨,那么就是这样),所以在普通红宝石中,你需要使用ObjectSpace在另一个答案中说。
您应该在我的回答中将Patient.all
替换为ObjectSpace.each_object(Patient)
以使用纯Ruby工作。