小编Cod*_*all的帖子

在Ruby中初始化常量的正确方法是什么?

我有一个简单的类定义了一些常量,例如:

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)

ruby dependencies warnings

10
推荐指数
2
解决办法
6770
查看次数

您如何以编程方式重新排序ATFolder子类的子项?

我有Plone产品,它使用自定义文件夹类型来包含一组自定义内容对象.文件夹类型是通过子类化BaseFolder创建的,它有一个包含几个文本字段的模式.目前,当自定义对象添加到自定义文件夹时,对象按其字母顺序排序.如何覆盖此行为并允许我的用户手动对自定义文件夹进行排序,例如通过"内容"视图?

python zope plone archetypes

6
推荐指数
1
解决办法
453
查看次数

标签 统计

archetypes ×1

dependencies ×1

plone ×1

python ×1

ruby ×1

warnings ×1

zope ×1