我正在实现一个表单,其中包括一个集合的硬编码下拉列表,我想知道什么是最好的解决方案,我知道下面暴露的两种方式都可以工作,但我还是按照以下方式做了:
class Example
# Options for Example.
self.options
[ 'Yes', 'No', 'Not sure' ]
end
end
它被Example.options
调用,但我知道也可以这样做:
class Example
# Options for Example.
OPTIONS = [ 'Yes', 'No', 'Not sure' ]
end
它将被称为Example::OPTIONS
。
问题是,这些是好方法还是根本不重要?
4条答案
按热度按时间k2arahey1#
后者更好,如果它是一个方法,每次调用都会创建一个新数组和新字符串,这是一种资源浪费。
rks48beu2#
视情况而定。这些值是要在类之外使用的吗?它们会变成动态的吗?它们会为子类而改变吗?
正如@sawa所写的,该方法(以这种方式编写)的缺点是每次都创建一个新的数组和字符串。
更好的写法是:
数组存储在示例变量
@options
中,以避免每次创建新数组。这样写的话,方法和常量非常相似。
一个关键的区别是,如果
Example
被子类化,那么改进options
方法比改进常量OPTIONS
更自然:对常量做类似的事情是很困难的。想象一下,你的选项列表在一个类方法中使用,这看起来像:
关于常量的微妙之处在于,
self::OPTIONS
和OPTIONS
并不总是相同的,而self.options
和options
是相同的。常量通常在没有指定作用域的情况下使用(例如,OPTIONS
而不是self::OPTIONS
),在这种情况下继承将根本无法工作。请注意,该方法使您有机会使结果动态化(即根据其他情况返回不同的结果),而无需更改API。
最后一点:我建议在您的数组上调用
freeze
,以避免任何人修改它。ffx8fchx3#
我通常使用的是上述技术的混合:
它有几个优点:
Player.jurisdictions
而不是Player::JURISDICTIONS
)。IMHO,性能在这里并不重要。
更新:可以使用
private_constant
方法隐藏常量(http://ruby-doc.org/core-2.3.0/Module.html#method-i-private_constant)oewdyzsn4#
为了进一步完善Artur的建议,我将使用一个类变量来隐藏常量的可见性。