2012-09-16 38 views
4
#!/usr/local/bin/ruby 
class OReport 
    attr_accessor :id, :name 
    def initialize(id, name, desc) 
     @id  = id 
     @name  = name 
     @desc  = desc 
    end 
end 

reports = Array.new 
reports << OReport.new(1, 'One', 'One Desc') 
reports << OReport.new(2, 'Two', 'Two Desc') 
reports << OReport.new(3, 'Three', 'Three Desc') 

現在如何搜索「Reports」爲2,以便我可以從中提取名稱和說明?紅寶石,數組,對象 - 選擇對象

+1

report = reports.select {| r | e.name == 1} .name – trueunlessfalse

+1

雖然你錯過了attr_accessor的描述,但是,。 – trueunlessfalse

+0

哎呀,真的,我的選擇會引發一個可怕的錯誤:) -sorry – trueunlessfalse

回答

4

如果reports的主要用途是通過ID檢索,然後再考慮使用哈希代替:

reports = {} 
reports[1] = OReport.new(1, 'One', 'One Desc') 
reports[2] = OReport.new(2, 'Two', 'Two Desc') 
reports[3] = OReport.new(3, 'Three', 'Three Desc') 

p reports[2].name # => "Two" 

哈希查找通常比數組查找更快,但更重要的是,它更簡單。

+0

從未想過使用報告[x]設置。簡單而簡單。 – WernerCD

+0

在這種情況下,從'OReport'實例中刪除'@ id'並且在需要引用一個id時使用'reports.key(report)'或者更好地將它保留在你的答案中? – sawa

+0

@sawa,如果OReport的一個實例需要知道它的ID用於某種目的,那麼它必須保留它。否則,如果需要,可以將該ID完全保存爲散列鍵。 –

10

使用find獲得從給定條件的集合的對象:

reports.find { |report| report.id == 2 } 
#=> => #<OReport:0x007fa32c9e85c8 @desc="Two Desc", @id=2, @name="Two"> 

如果您希望多個對象滿足條件,並且希望所有的人,而不是第一個匹配的一個,使用select

+0

我喜歡它,但韋恩的答案更容易,一切都基於ID,所以會更快,更易於維護。 – WernerCD

0

您可以通過以下語法獲得2的報告。

reports[1].name 
reports[1].id 

它肯定會爲你工作。

+0

如果以不同的順序將它們添加到數組中,該怎麼辦? –