3

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

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 中做到这一点。我们可以在方法中创建常量吗?

4

3 回答 3

3

不,你不能,但即使你可以也没什么意义,因为 Ruby 中的常量并不是真正的常量:

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

如果您担心对象本身被修改(而不是引用,如果您返回对象更有意义),那么您可能希望freeze对象防止它被变异(尽管请注意它是一个浅冻结,对于深度冻结,请参阅IceNine)。

于 2013-07-15T05:57:50.123 回答
2

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

def foo
  Foo = :foo
end
# => SyntaxError: ... dynamic constant assignment
于 2013-07-15T06:12:15.453 回答
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 定律会不断被打破!

于 2013-07-15T05:37:36.037 回答