如何使用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 :(得分: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", ...]
答案 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中定义了status
和color
方法时,这才有效。如果您没有定义这些方法,那么请查看Mike Li直接访问实例变量的答案。这当然违反了OO封装设计原则。
其次,我注意到ID为1001的MyObject没有color
属性,它有一个名为blue
的属性,值为450.
为了更准确地回答您的问题,如果您可以粘贴MyObject的类定义以及您获得的确切错误,将会有所帮助。