2

如何使用 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

4 回答 4

4

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

array_of_strings = @myvar.map { |name| "Status: #{name.status}  Color: #{name.color}" }
于 2013-08-01T03:00:46.523 回答
3

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

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

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

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

还有一个更简洁的版本:

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

(请参阅Ruby 中的 & 运算符。)

于 2013-08-01T03:33:09.653 回答
0

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

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

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

其次,我注意到 ID 为 1001 的 MyObject 没有该color属性,它有一个名为blue450 的属性。

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

于 2013-08-01T05:55:56.003 回答
0

您可以通过调用获取实例变量instance_variable_get("@name")

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

希望能帮助到你。

于 2013-08-01T02:58:10.333 回答