2013-08-01 56 views
1

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

但它返回完整的對象,而不是屬性值。

+0

在這種情況下,問題不在代碼中。 OP說他得到了返回值而不是語法錯誤。但是你可以自由決定哪個版本更清晰。 –

回答

3

當您用塊調用Array#each時,它會返回數組本身。也許你正在尋找Array#map

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

你可以通過調用instance_variable_get("@name")

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

希望它可以幫助獲得實例變量。

3

根據該文件,Array#each如果你提供一個塊返回數組。

如果您想要一組「屬性」,請使用Array#map。例如,

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

地圖創建新的數組和替換每個元件在@myvar具有值「返回」由塊。請注意,這假定您有一個獲取方法status和其他屬性。如果你不這樣做,你可以使用attr_reader :status, ...來創建它們。

還有一個更簡潔的版本:

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

(見The & Operator in Ruby

+0

請注意,'&:'僅適用於Ruby 1之後。9左右 –

+0

從技術上講,'Array#each'只會在你提供一個塊時返回數組,如果你忽略了這個塊,'each'就會給你一個'Enumerator'。 –

+0

謝謝。我更新了我的答案。 –

0

對於初學者有在您調用each用括號方式的語法錯誤「(」代替。用大括號「{」再有就是在聲明的結尾沒有相應的括號收/括號正確調用想 -

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

只有在MyObject中定義了方法statuscolor時,這纔會起作用。如果您沒有定義這些方法,請查看Mike Li的答案以直接訪問實例變量。這當然違反了OO封裝設計原則。

其次,我注意到,爲MyObject ID爲1001不具備color屬性,它與450。

值,以便名爲blue屬性以獲得更準確的回答你的問題,它會如果您可以粘貼MyObject的類定義以及您正在獲取的確切錯誤,則可以提供幫助。