A.4 常量

上一篇 / 下一篇  2008-06-12 09:20:29

查看( 158 ) / 评论( 8 )
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,错误。因为常量往往意味着:不再改变了。这也是为什么给常量重新赋值会引发警告的原因。比如:

def Foo
    Rubylet = 1
end

        也正是基于这个理由,一般情况下不要将方法名的首字母大写,尽管允许这样做,但在实施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。

TAG:

libaoming发布于2008-06-12 10:07:13
已作笔记 呵呵
起~~
wosmvp发布于2008-06-12 11:36:19

QUOTE:

原帖由 libaoming 于 2008-6-12 10:07 发表
已作笔记 呵呵
起~~
笔记要记好  :)
同学们要努力,大家知道了吗?
老师辛苦了,下节课再见
小飞猪之Ruby窝 drive2me 发布于2008-06-12 11:41:49

QUOTE:

原帖由 libaoming 于 2008-6-12 10:07 发表
已作笔记 呵呵
起~~
利用收藏呀,我用了。需要时就可以查!
libaoming发布于2008-06-13 08:27:09
期待新内容~~~
mztest发布于2008-06-13 10:11:51
做为一个刚学RUBY的人,我不得不说一小点儿,,很多东西对新手来说,很容易搞迷糊的。

QUOTE:

也正是基于这个理由,一般情况下不要将方法名的首字母大写,
一边说不让用,而讲程里却全在用,这让我不知所措,
libaoming发布于2008-06-13 10:50:53

QUOTE:

原帖由 mztest 于 2008-6-13 10:11 发表
做为一个刚学RUBY的人,我不得不说一小点儿,,很多东西对新手来说,很容易搞迷糊的。


一边说不让用,而讲程里却全在用,这让我不知所措,
同意,以后尽量还是标准点的好(除特殊语言,或用意除外)。以免弄糊一堆人~~
eipeng发布于2008-06-17 11:30:03
来晚了...认真阅读ing~``
rocway发布于2008-07-12 17:43:51
讲的很深入,赞
我来说两句

(可选)

日历

« 2009-07-05  
   1234
567891011
12131415161718
19202122232425
262728293031 

我的存档

数据统计

  • 访问量: 44
  • 日志数: 19
  • 建立时间: 2008-06-11
  • 更新时间: 2008-06-11

RSS订阅

Open Toolbar