我有一个简单的类定义了一些常量,例如:
module Foo
class Bar
BAZ = "bof"
...
Run Code Online (Sandbox Code Playgroud)
一切都是小狗和彩虹,直到我告诉Rake进行我的所有Test::Unit测试.当它发生时,我收到警告:
bar.rb:3: warning: already initialized constant BAZ
Run Code Online (Sandbox Code Playgroud)
我的习惯是通过使常量初始化有条件来避免这些警告,例如:
...
BAZ = "bof" unless const_defined? :BAZ
...
Run Code Online (Sandbox Code Playgroud)
这似乎解决了这个问题,但它有点单调乏味,而且我从未见过其他人以这种方式初始化常量.这让我觉得我可能做错了.有没有更好的方法来初始化不会产生警告的常量?
更新:通过更详细地说明我如何使用这些常量,假设我已经定义了一个Token类,它对于所有字符都是常量,这些字符是某种人工语言语法的一部分.我还有一个Scanner类,它读取一个字符流,Token为每个字符生成一个实例.
module Foo
class Token
LPAREN = "("
RPAREN = ")"
...
end
class Scanner
def next_token
case read_char()
when Token::LPAREN: # Generate a new LPAREN token
...
Run Code Online (Sandbox Code Playgroud)
也就是说,在检查应该为给定字符生成什么类型的令牌时,我想使用中定义的常量Token.
更新2:Jörg的回答显示问题可能在于我在require语句中构建路径的方式,而不是我如何初始化或使用常量.我重写了我的require语句以消除任何手动路径创建,例如:
# File: $PROJECT_ROOT/lib/foo.rb; trying to load …Run Code Online (Sandbox Code Playgroud) 我有Plone产品,它使用自定义文件夹类型来包含一组自定义内容对象.文件夹类型是通过子类化BaseFolder创建的,它有一个包含几个文本字段的模式.目前,当自定义对象添加到自定义文件夹时,对象按其字母顺序排序.如何覆盖此行为并允许我的用户手动对自定义文件夹进行排序,例如通过"内容"视图?