如何在Ruby中定义类级别常量正则表达式以供外部类使用

时间:2015-02-18 09:47:08

标签: ruby regex constants

我正在编写一些测试来验证在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中用于定义需要在其他类中使用的常量正则表达式的正确方法。我在定义,初始化及其使用方面遇到了问题,

感谢。

1 个答案:

答案 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