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
andOPTIONS
并不总是相同的,而self.options
andoptions
是相同的。通常在不指定范围的情况下使用常量(例如OPTIONS
,而不是self::OPTIONS
),并且在这种情况下继承将根本不起作用。
请注意,该方法使您有机会在不更改 API 的情况下使结果动态化(即根据其他情况返回不同的结果)。
最后说明:我建议您调用freeze
您的阵列,以避免任何人修改它。