Ruby等价的C ++ Const?

时间:2009-04-20 04:59:31

标签: ruby variables const mutable

我在业余时间学习Ruby,我对常量的语言结构有疑问。 Ruby是否具有等效的C ++ const关键字来防止变量被修改?这是一些示例代码:

first_line   = f.gets().chomp()
column_count = first_line.split( %r{\s+} ).size()
print column_count, "\n"

我想将column_count声明为const,因为我在我的程序中使用它,我真的不想错误地修改它。 Ruby是否为这样做提供了一种语言结构,或者我应该把它搞砸并意识到我的变量总是可变的?

对评论的回应:

'我认为,“意外”覆盖变量的最可能原因是长代码块。我同意你的观点的精神,但不同意这封信。关于避免长代码块和不必要状态的观点是一个很好的观点,但是对于常量来说,在描述实现中的代码设计时也很有用。我的代码中const的很大一部分值来自于注释哪些变量我应该改变,哪些不应该改变,所以如果我明年再回到我的代码中,我就不会想要改变它们。这是同样的观点,表明由于良好的变量名称和明确的缩进而使用简短注释的代码比通过详细注释解释的笨拙编写的代码更好。

另一种选择似乎是Ruby的#freeze方法,我也喜欢它的外观。感谢大家的回复。

3 个答案:

答案 0 :(得分:4)

Ruby 变量通常都是可变的。

超越Jeremy的答案,虽然完全准确,但并不会引导您使用非常“主流”或惯用语的Ruby风格,我不建议将其用于采用。 Ruby不像C ++那样工作,并且通常不适合C ++最适合使用的东西。操作系统,文字处理器,那种东西。

我认为,“意外”覆盖变量的最可能原因是长代码块。毕竟,如果你用五行方法改变一个变量的值,它就会非常明显!如果你习惯性地编写比10行更长的代码块,那么那些块可能做了太多的事情,我强烈建议你努力将它们分解(增加cohesion)。尽可能地对变量进行本地化,以最大限度地减少意外副作用的可能性(减少coupling)。

答案 1 :(得分:4)

按照惯例,ruby中的常量通常用COLUMN_COUNT等全部大写字母书写。但正如所指出的那样,所有以大写字母开头的变量都是常量。

答案 2 :(得分:3)

以大写字母开头的变量是Ruby中的常量。因此,您可以将代码更改为:

first_line   = f.gets().chomp()
Column_count = first_line.split( %r{\s+} ).size()
print Column_count, "\n"

现在,如果您尝试修改Column_count,则会收到警告。