如何访问Ruby中对象数组中的属性?

时间:2013-08-01 02:25:28

标签: 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}"

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

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

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

Map创建一个新数组,并将@myvar中的每个元素替换为该块的“返回”值。请注意,这假设您有status的getter方法和其他属性。如果不这样做,可以使用attr_reader :status, ...创建它们。

还有一个更简洁的版本:

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

(见The & Operator in Ruby。)

答案 2 :(得分:0)

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

来获取实例变量
@myvar.each { |myObject| puts "Status: #{myObject.instance_variable_get("@status")}  Color: #{myObject.instance_variable_get("@color")}" }

希望它有所帮助。

答案 3 :(得分:0)

对于初学者来说,使用paren“(而不是花括号”{“来调用each的方式存在语法错误。然后在结尾处没有相应的关闭paren /大括号。声明。正确的调用应该像 -

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

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

其次,我注意到ID为1001的MyObject没有color属性,它有一个名为blue的属性,值为450.

为了更准确地回答您的问题,如果您可以粘贴MyObject的类定义以及您获得的确切错误,将会有所帮助。