- 论坛徽章:
- 0
|
A.4 常量
Ruby区分大小写, Ruby的常量以大写字母开头,一般在定义常量时就进行赋值,以后如果再对常量进行赋值会引发一些警告。由于Ruby是弱类型语言,弱类型语言标志着Ruby在定义常量时不需要指定变量和常量的类型,因此你要特别注意相关标识符的定义,比如,Ruby中,一般的规则方法定义时,方法的名称一般要求小写,但你实在要写为大写也是可以的,下面的例子说明了这个问题:- Foo = 1
- def Foo
- puts Foo
- end
- class Foo
- end
- puts defined?Foo
- puts defined?Foo()
- Foo
- Foo()
复制代码 这里Foo既是常量的名称,也是方法的名称,defined?用于是否有定义,若有定义返回该表达式的种类,若无定义返回nil。上面代码中defined?Foo返回constant,defined?Foo()返回method。
单行语句Foo,对于初学者来说不容易理解。从早期C语言的时代开始,我们就有一个语法构造:变量的语法模仿表达式的语法。这里常量Foo模仿了表达式,并且它的值成了这行语句的值。
为了把常量介绍得相对完整,有必要先介绍一下“顶层对象”的概念。
在Ruby中一切都是对象,敏捷思考的读者可能会问:本节上面的代码中常量Foo和方法被定义在哪个对象中呢?毕竟在面向对象的程序中,只有对象才能真正具备有行为的能力。为了了解这个问题,我们可以在上面的代码中加入如下语句:
puts self.class
puts self.object_id
该语句输出:
Object
21658870
而这里的self的含义是本类对象的意思,它同C++、Java的this类似。这就说明,我们刚才是在Object的实例中定义的Foo常量和方法Foo方法,21658870是对象id标识。我们称这个对象为“顶层对象”。
事实上,常量可以在类、模块以及顶层对象中定义,但不能在方法中定义。- Foo = 1
- class A
- Log = 1
- end
- module B
- Web = 1
- end
复制代码 这段代码是正确,但如果你哪怕是在顶层对象的方法中定义常量会引发:
XXX.rb:14: dynamic constant assignment,错误。因为常量往往意味着:不再改变了。这也是为什么给常量重新赋值会引发警告的原因。比如:也正是基于这个理由,一般情况下不要将方法名的首字母大写,尽管允许这样做,但在实施Ruby方法的动态编程时,我不能保证你不会遇到问题。
常量有它自身的作用范围,或者说有效范围。通常常量在类中的作用范围是这样的:
1、 顶层对象的常量,可以在任意地方使用;
2、 类中定义的常量在类范围内起作用;
3、 可以在子类中访问父类的常量;
4、 在一个类封装的内部类中可以访问外部类的常量;
在存取以上这些常量时,如果你的代码不在该常量所在的作用域,你应该使用“::”操作符来限定:存取顶层常量时,“::”的左边没有内容,有类时,为类的名字。
容易模糊的是:在内部类、子类中可以重新定义同名的常量,不会引发警告,它们是两个不同作用域的同名常量。
模块中也可以定义常量,关于着一点我们在后文叙述。
有必要指出的是:类名和模块名也是常量。- class Foo
- class Test
- end
- end
- puts defined?Foo
- puts defined?Foo::Test
- module Test
- class Foo
- end
- end
- puts defined?Test
- puts defined?Test::Foo
复制代码 这段代码输出:constant。 |
|