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

如何在Ruby中访问对象数组中的属性?,ruby,Ruby,如何使用Ruby访问包含对象数组的对象的属性 我有一个变量,看起来像这样: @myvar = [#<MYOBJECT::MObject0x00000000000000="000", @id="1000", @status="Open", @color="Red">, #<MYOBJECT::MObject0x00000000000001="001", @id="1001", @status="Closed", @blue="450">] 但是它返回的是完整的对象,而

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

我有一个变量,看起来像这样:

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

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

您可以通过调用
实例变量\u get(@name”)

希望有帮助。

当您使用块调用时,它会返回数组本身。也许您正在寻找:


根据文档,如果提供块,则返回一个数组

如果需要“属性”数组,请使用。比如说,

@myvar.map { |obj| obj.status }
#=> ["Open", "Closed", ...]
Map创建一个新数组,并用块返回的值替换
@myvar
中的每个元素。注意,这假设您有一个用于
status
和其他属性的getter方法。如果没有,可以使用
attr\u reader:status,
创建它们

还有一个更简洁的版本:

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

(请参阅。)

对于初学者,使用括号“(“而不是大括号“{”)调用每个
的方式中存在语法错误。然后在语句末尾没有相应的结束括号。正确的调用应该是-

@myvar.each {|name| puts "Status: #{name.status}  Color: #{name.color}"}
只有在MyObject中定义了方法
status
color
时,这才有效。如果没有定义这些方法,请看Mike Li的答案,直接访问实例变量。这当然违反了OO封装设计原则

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


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

在这种情况下,问题不在代码中。OP说他得到的是返回值而不是语法错误。但您可以自由决定哪个版本更清晰。从技术上讲,
array#each
仅在提供块时返回数组,如果省略块,
each
将为您提供一个
枚举器。
@myvar.map { |obj| obj.status }
#=> ["Open", "Closed", ...]
@myvar.map(&:status)
#=> ["Open", "Closed", ...]
@myvar.each {|name| puts "Status: #{name.status}  Color: #{name.color}"}