免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3220 | 回复: 2
打印 上一主题 下一主题

A.4 常量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-15 11:56 |只看该作者 |倒序浏览
A.4 常量


Ruby区分大小写, Ruby的常量以大写字母开头,一般在定义常量时就进行赋值,以后如果再对常量进行赋值会引发一些警告。由于Ruby是弱类型语言,弱类型语言标志着Ruby在定义常量时不需要指定变量和常量的类型,因此你要特别注意相关标识符的定义,比如,Ruby中,一般的规则方法定义时,方法的名称一般要求小写,但你实在要写为大写也是可以的,下面的例子说明了这个问题:
  1. Foo = 1
  2. def Foo
  3. puts Foo
  4. end

  5. class Foo
  6. end

  7. puts defined?Foo
  8. puts defined?Foo()

  9. Foo
  10. 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标识。我们称这个对象为“顶层对象”。
事实上,常量可以在类、模块以及顶层对象中定义,但不能在方法中定义。
  1. Foo = 1

  2. class A
  3. Log = 1
  4. end

  5. module B
  6. Web = 1
  7. end
复制代码
这段代码是正确,但如果你哪怕是在顶层对象的方法中定义常量会引发:
XXX.rb:14: dynamic constant assignment,错误。因为常量往往意味着:不再改变了。这也是为什么给常量重新赋值会引发警告的原因。比如:
  1. def Foo
  2. Rubylet = 1
  3. end
复制代码
也正是基于这个理由,一般情况下不要将方法名的首字母大写,尽管允许这样做,但在实施Ruby方法的动态编程时,我不能保证你不会遇到问题。
常量有它自身的作用范围,或者说有效范围。通常常量在类中的作用范围是这样的:

1、 顶层对象的常量,可以在任意地方使用;
2、 类中定义的常量在类范围内起作用;
3、 可以在子类中访问父类的常量;
4、 在一个类封装的内部类中可以访问外部类的常量;

在存取以上这些常量时,如果你的代码不在该常量所在的作用域,你应该使用“::”操作符来限定:存取顶层常量时,“::”的左边没有内容,有类时,为类的名字。
容易模糊的是:在内部类、子类中可以重新定义同名的常量,不会引发警告,它们是两个不同作用域的同名常量。
模块中也可以定义常量,关于着一点我们在后文叙述。

有必要指出的是:类名和模块名也是常量。
  1. class Foo
  2. class Test
  3. end
  4. end

  5. puts defined?Foo
  6. puts defined?Foo::Test

  7. module Test
  8. class Foo
  9. end
  10. end

  11. puts defined?Test
  12. puts defined?Test::Foo
复制代码
这段代码输出:constant。

论坛徽章:
0
2 [报告]
发表于 2011-03-15 12:05 |只看该作者
村草 V5

论坛徽章:
0
3 [报告]
发表于 2011-03-15 12:41 |只看该作者
村艹后面可以把你这一系列做个汇整,形成循序渐进的一系列教程。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP