TL; DR:這取決於。這些價值是否意味着在課外使用?他們會不會變得活躍?他們可以改變爲子類嗎?
@sawa寫道,方法的缺點(用這種方式寫的)是每次都創建一個新的數組和字符串。
一種更好的方式來寫這將是:
class Example
def self.options
@options ||= ['Yes', 'No', 'Not sure']
end
end
陣列被存儲在實例變量@options
,以避免每次創建一個新的數組。
用這種方式寫的,該方法與常量非常相似。
一個關鍵的區別是,如果Example
的子類,它會更自然細化options
方法比恆定OPTIONS
:
class Parent < Example
def self.options
@options ||= [*super, 'Extra']
end
end
做常量類似的東西是困難的。試想一下,你的選項列表中的一個類的方法時,這將是這樣的:
class Example
OPTIONS = ['Yes', 'No', 'Not sure']
def self.foo(arg)
puts "Available options:",
self::OPTIONS # The self:: is needed here
# ...
end
end
class Parent < Example
OPTIONS = [*superclass::OPTIONS, 'Extra']
end
棘手的約常量,是self::OPTIONS
和OPTIONS
並不總是相同的,而self.options
和options
是相同的。通常在不指定範圍的情況下使用常量(例如OPTIONS
而不是self::OPTIONS
),在這種情況下繼承將無法正常工作。
請注意,該方法使您可以在不更改API的情況下使結果成爲動態的(即根據其他情況返回不同的結果)。
最後說明:我建議您在陣列上調用freeze
,以避免任何人修改它。
普遍接受的做法是後者與註釋的大寫在前的文件的形式提供給用戶,這是一個恆定的 – 2013-04-09 13:56:15
無關的一個可能的答案,我會建議使用過的字符串,除非你的代碼將專門符號需要字符串。因此'[:是,:否,:not_sure]' – 2013-04-09 14:01:29