2013-08-01 59 views
1

如何使用Ruby访问包含对象数组的对象的属性?如何访问Ruby中的对象数组中的属性?

我有一个变量,它看起来是这样的:

@myvar = [#<MYOBJECT::MObject0x00000000000000="000", @id="1000", 
@status="Open", @color="Red">, #<MYOBJECT::MObject0x00000000000001="001", 
@id="1001", @status="Closed", @blue="450">] 

我想:

@myvar.each(|name| puts "Status: #{name.status} Color: #{name.color}" 

但它返回完整的对象,而不是属性值。

+0

在这种情况下,问题不在代码中。 OP说他得到了返回值而不是语法错误。但是你可以自由决定哪个版本更清晰。 –

回答

3

当您用块调用Array#each时,它会返回数组本身。也许你正在寻找Array#map

array_of_strings = @myvar.map { |name| "Status: #{name.status} Color: #{name.color}" } 
0

你可以通过调用instance_variable_get("@name")

@myvar.each { |myObject| puts "Status: #{myObject.instance_variable_get("@status")} Color: #{myObject.instance_variable_get("@color")}" } 

希望它可以帮助获得实例变量。

3

根据该文件,Array#each如果你提供一个块返回数组。

如果您想要一组“属性”,请使用Array#map。例如,

@myvar.map { |obj| obj.status } 
#=> ["Open", "Closed", ...] 

地图创建新的数组和替换每个元件在@myvar具有值“返回”由块。请注意,这假定您有一个获取方法status和其他属性。如果你不这样做,你可以使用attr_reader :status, ...来创建它们。

还有一个更简洁的版本:

@myvar.map(&:status) 
#=> ["Open", "Closed", ...] 

(见The & Operator in Ruby

+0

请注意,'&:'仅适用于Ruby 1之后。9左右 –

+0

从技术上讲,'Array#each'只会在你提供一个块时返回数组,如果你忽略了这个块,'each'就会给你一个'Enumerator'。 –

+0

谢谢。我更新了我的答案。 –

0

对于初学者有在您调用each用括号方式的语法错误“(”代替。用大括号“{”再有就是在声明的结尾没有相应的括号收/括号正确调用想 -

@myvar.each {|name| puts "Status: #{name.status} Color: #{name.color}"} 

只有在MyObject中定义了方法statuscolor时,这才会起作用。如果您没有定义这些方法,请查看Mike Li的答案以直接访问实例变量。这当然违反了OO封装设计原则。

其次,我注意到,为MyObject ID为1001不具备color属性,它与450。

值,以便名为blue属性以获得更准确的回答你的问题,它会如果您可以粘贴MyObject的类定义以及您正在获取的确切错误,则可以提供帮助。