-3

我做了一个应用程序,其中 aPatient有名称等。

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
4

4 回答 4

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"
于 2013-07-13T11:22:28.903 回答
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.

于 2013-07-13T11:50:39.560 回答
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的 forObjectSpace.each_object(Patient)以使用纯 Ruby 工作。

于 2013-07-13T11:25:12.887 回答
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
于 2013-07-13T11:20:03.637 回答