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

Pla*_*fan 3 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
Run Code Online (Sandbox Code Playgroud)

这只会产生错误:未定义方法 `DATE=' for Expressions: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
Run Code Online (Sandbox Code Playgroud)

这会产生 NameError: uninitialized constant Expressions::DATE 错误。

我知道我可以只定义要用作实例的类的属性,但这效率低下并且不是问题的正确解决方案(只是一个 hack)。(在 C++ 中,我会使用静态常量,完成)

所以我真的被卡住了。我需要知道在 Ruby 中定义需要在其他类中使用的常量正则表达式的正确方法是什么。我在定义、初始化及其使用方面遇到问题,

谢谢。

Vit*_*upt 5

Ruby 中的常量类似于变量,只是它的值应该在程序运行期间保持不变。Ruby 解释器实际上并不强制常量的恒定性,但如果程序更改常量的值,它会发出警告。从词法上讲,常量的名称看起来像局部变量的名称,只是它们以大写字母开头。按照惯例,大多数常量都以大写字母书写,并用下划线分隔单词 LIKE_THIS。Ruby 类和模块名称也是常量,但它们通常使用首字母大写和驼峰命名,LikeThis。

Ruby 编程语言:David Flanagan;松本幸弘。

这应该有效:

class Expressions
  DATE = /.../
end

class MyTest < Test::Unit::TestCase
  def setup
    @expression = Expressions::DATE
  end
  # ...
end
Run Code Online (Sandbox Code Playgroud)