2013-07-13 18 views
-3

我做了一個應用程序,一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 

回答

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" 
+0

即時通訊工作與鼻炎,並得到這個錯誤:>> [運行編輯器腳本(rfrank2.rb)] => RuntimeError:ObjectSpace被禁用; each_object只能與Class一起使用,通過-X + O在org/jruby/RubyObjectSpace中啓用 each_object。Java的:在rfrank2.rb 173 (根):23把 零 >> –

+0

@EmSta它在我的情況下工作。這是去這種事情的好方法。我不知道爲什麼它不適合你的情況。 –

+0

我不知道爲什麼這被標記爲最佳答案。肯定檢查@ Jeffrey的答案在下面。 http://stackoverflow.com/a/17629915/107277 –

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 
+0

是的,它是這樣工作的,但我的目標是,我沒有提及A和B,而只是成爲所有患者 –

+1

@EmSta,我更新的代碼。 – falsetru

+0

我喜歡解決...... :) –

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說下來的意見,這是沒有護欄(我不好,如果你使用的軌道是這樣的路要走,雖然)所以在純Ruby中,你需要正如他在另一個答案中所說的那樣使用ObjectSpace。

你應該替換我的Patient.allObjectSpace.each_object(Patient)在我的答案在純紅寶石工作。

+1

* Ruby *中沒有'#all'方法。這個問題標有* Ruby *。 –

+0

我使用ruboto android和我總是得到錯誤:>> [Running editor script(rfrank2.rb)] => NoMethodError:undefined方法'each'對於患者: (root)在rfrank2.rb:23 零 >> –

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 

一個好的經驗法則是:

Don't use reflection/introspection unless it is absolutely necessary.

這是肯定不是這樣。

注意:attr_accessor :vorName應該是attr_accessor :vorname