我可以在Ruby中创建一个方法范围的常量吗?

时间:2013-07-15 05:30:04

标签: ruby oop constants

我想创建一个只能在其包含方法内访问的常量。在其他语言中,人们可能会这样做:

void function()
{
  const int MAX = 25;
  int array[MAX];

  //DO SOMETHING
}
void function2()
{
   const int MAX = 50;
   int array[MAX];
   //DO SOMETHING ELSE
}

在这两种方法中,MAX不是全局的。我相信数据隐藏,我想知道是否有办法在Ruby中执行此操作。我们可以在方法中创建常量吗?

3 个答案:

答案 0 :(得分:3)

不,你不能,但即使你可能没有太多意义,因为Ruby中的常量并不是真正的常量:

MY_CONST = 'foo'
MY_CONST << 'bar'
MY_CONST  #=> 'foobar'
MY_CONST = 'baz' # warning: already initialized constant MY_CONST

如果您担心对象本身被修改(而不是引用,如果您返回对象则更有意义),那么您可能希望freeze该对象以防止它被删除变异(虽然注意到它是浅层冻结,深度冻结,见IceNine)。

答案 1 :(得分:2)

你做不到。问题不在于常量是否是私有的。 Ruby禁止在方法定义中创建常量。

def foo
  Foo = :foo
end
# => SyntaxError: ... dynamic constant assignment

答案 2 :(得分:1)

有点矛盾,这个想法很奇怪,动态常数怎么样?

class FOO
  def method
    method_constant :METHOD_CONSTANT, 25
    METHOD_CONSTANT
  end
  def method_constant(constant_name, value)
    constant_name.to_s.slice!(0,1) 
    FOO.class_eval "#{constant_name} = #{value}"
    FOO.class_eval "private_constant :#{constant_name}"
  end
  private :method_constant
end

f = FOO.new
f.method #:=>25
FOO::METHOD_CONSTANT #:=>error

嗯,这些常量将超出定义它的方法范围。有一件事我不确定是否是,有多少法律的OOPS不断这将打破!