2017-06-01 55 views
0

我有這個事情的自定義類,與事對象的數組,像這樣:我可以控制自定義對象的數組在Ruby中的樣子嗎?

class Thing 
    attr_accessor :name 

    def initialize(name) 
    @name = name 
    end 

    def to_s 
    @name 
    end 
end 

a = [] 
a << Thing.new("Fred") 
a << Thing.new("George") 
a << Thing.new("Steve") 
a 

當我看到在IRB的陣列,我希望它看起來像這樣:

[Fred, George, Steve] 

而非此(對象信息): [#,#,#]

換句話說,我想能夠看到到陣列中的每個元素的值to_s當我在看該陣列與irb。有沒有辦法做到這一點?

+0

這個'a.map {| o | o.name}#=> [「Fred」,「George」,「Steve」]或者'a.map(&:name)#=> [弗雷德「,」喬治「,」史蒂夫「]? –

+0

如果你想要一個類的所有實例,你可以寫ObjectSpace.each_object(Thing).map(&:name)#=> [「Fred」,「George」,「Steve」]'。有關更多詳細信息,請參閱[這裏](https://stackoverflow.com/questions/14318079/how-do-i-list-all-objects-created-from-a-class-in-ruby)。 –

回答

5

您可能要重寫#inspect獲取對象的人類可讀的版本:

class Thing 
    attr_accessor :name 

    def initialize(name) 
    @name = name 
    end 

    def inspect 
    @name 
    end 
end 

a = [] 
a << Thing.new("Fred") 
a << Thing.new("George") 
a << Thing.new("Steve") 
a 

=> [Fred, George, Steve] 
+0

這正是我所期待的。謝謝! – Glenn

1

對於它的價值,IRB通常不是你的代碼的接口,所以它可能不是最好的對於如何在狹窄的環境中呈現你的對象感到太過分了。

您可以覆蓋inspect,正如Adam Sheehan所建議的。這將適用於Thing的任何實例,根據您的其他應用程序,這可能是可取的或不可取的。

另一種選擇,如果你只想與物體的這個特定集合這種表示是定義自定義集合:

class Things < Array 
    def inspect 
    "[#{ map(&:name).join(', ') }]" 
    end 
end 

a = Things.new 
a << Thing.new("Fred") 
a << Thing.new("George") 
a << Thing.new("Steve") 
a 

您也可以將您的陣列到物聯網的一個實例:

a = [] 
a = Things.new(a) 

這實際上是一個Decorator

相關問題