2017-06-01 52 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

相关问题