A.4 常量

A.4 常量

php?name=Ruby" onclick="tagshow(event)" class="t_tag">Ruby区分大小写, php?name=Ruby" onclick="tagshow(event)" class="t_tag">Ruby的常量以大写字母开头,一般在定义常量时就进行赋值,以后如果再对常量进行赋值会引发一些警告。由于php?name=Ruby" onclick="tagshow(event)" class="t_tag">Ruby是弱类型语言,弱类型语言标志着php?name=Ruby" onclick="tagshow(event)" class="t_tag">Ruby在定义常量时不需要指定变量和常量的类型,因此你要特别注意相关标识符的定义,比如,php?name=Ruby" onclick="tagshow(event)" class="t_tag">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。
已作笔记 呵呵
起~~
引用:
原帖由 libaoming 于 2008-6-12 10:07 发表
已作笔记 呵呵
起~~
引用:
原帖由 libaoming 于 2008-6-12 10:07 发表
已作笔记 呵呵
起~~
期待新内容~~~
做为一个刚学RUBY的人,我不得不说一小点儿,,很多东西对新手来说,很容易搞迷糊的。
引用:
也正是基于这个理由,一般情况下不要将方法名的首字母大写,
引用:
原帖由 mztest 于 2008-6-13 10:11 发表
做为一个刚学RUBY的人,我不得不说一小点儿,,很多东西对新手来说,很容易搞迷糊的。


一边说不让用,而讲程里却全在用,这让我不知所措,
来晚了...认真阅读ing~``
讲的很深入,赞