我正在编写一些测试来验证在Ruby控制台应用程序中使用的某些正则表达式的行为。我试图在一个不打算实例化的类上定义常量类级别字段(只是应该在其上定义常量RE值。我在使用Ruby习惯用法(我有C ++ / C#背景)正确定义它时遇到了麻烦。
首先我尝试定义一个类常量
class Expressions
# error is on following line (undefined method DATE)
Expressions.DATE = /(?<Year>\d{4})-(?<Month>\d{2})-(?<Day>\d{2})/
end
class MyTest < Test::Unit::TestCase
def setup
@expression = Expressions::DATE
end
def test
assert "1970-01-01" =~ @expression
end
end
这只会产生错误:表达式的未定义方法`DATE =':Class(NoMethodError)
接下来我尝试了类属性:
class Expressions
@@Expressions.DATE = /(?<Year>\d{4})-(?<Month>\d{2})-(?<Day>\d{2})/
end
class MyTest < Test::Unit::TestCase
def setup
# NameError: uninitialized constant Expressions::DATE here:
@expression = Expressions::DATE
end
def test
assert "1970-01-01" =~ @expression
end
end
这会产生一个NameError:未初始化的常量表达式:: DATE错误。
我知道我可以在类上定义要用作实例的属性,但这样效率低,而且不是问题的正确解决方案(只是一个黑客)。 (在C ++中我会使用静态const,完成)
所以我真的被卡住了。我需要知道Ruby中用于定义需要在其他类中使用的常量正则表达式的正确方法。我在定义,初始化及其使用方面遇到了问题,
感谢。
答案 0 :(得分:3)
Ruby中的常量就像一个变量,除了它的值应该是 在节目期间保持不变。 Ruby解释器没有 实际上强制执行常量的常量,但如果是,它会发出警告 程序改变常量的值。从词汇上看,常量的名称看起来 比如局部变量的名称,除了它们以大写字母开头。 按照惯例,大多数常量都是全部用大写字母写成的 单词,LIKE_THIS。 Ruby类和模块名也是常量,但是 它们通常用初始大写字母和骆驼案写成, LikeThis。
Ruby编程语言:David Flanagan; Yukihiro Matsumoto。
这应该有效:
class Expressions
DATE = /.../
end
class MyTest < Test::Unit::TestCase
def setup
@expression = Expressions::DATE
end
# ...
end