我想创建一个只能在其包含方法内访问的常量。在其他语言中,人们可能会这样做:
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中执行此操作。我们可以在方法中创建常量吗?
答案 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不断这将打破!