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