5.3 详解变量—— 动态类型

变量是什么?变量有哪些特征呢?学习编程的过程,就是深化理解变量的过程。
先说变量是什么?变量是代号。
在数学中,你写下一个小写的英文字母“ f ”,这个 f 可以是数字 5 ,也可以是一个函数式 f = n * n + 1 ,还可以是一个曲面,或者是一个逻辑蕴涵关系…数学里,我们把常用的符号约定俗成,比如π代表圆周率,∑表示求和。
编程语言的产生,建立在数学的基础上。在汇编语言的时代,一条语句
 LD  x,37H ,
其中的 LD 是操作码,代表一种操作;x 和 37H 是操作数,是被操作的对象。无论是 LD ,还是 x 和 37H ,对于机器来说,都只是符号。
后来,编程语言发展成两大类,一类函数式语言,一类命令式语言。命令式语言将操作数演化成现在我们熟悉的变量,将操作码演化成方法(或叫函数),对变量执行各种操作。面向对象编程又将基本变量和方法封装在一起,成为一个更复杂的变量——对象。但是,在一个类中仍然区分基本变量和方法。函数式语言则不同,一开始的函数式语言不区分变量和方法,一切都是表(list),表就是能够不断分解成单个元素的数学符号。表可以是变量,可以是方法。后来的有些函数式语言,吸取了命令式语言的语法,也区分变量和方法。
也有一些命令式语言,融合了函数式语言的语法, Ruby 就是这样的语言,变量和方法区分得不很明显。
其次,说一说变量有哪些特征呢?
1). 变量有名字;
2).变量代表的那个事物应该有一个可以用数学度量的值;长度,面积,速度大小,磁场强度…
3).为了区别事物,我们将事物分成几个基本类型。所以,代表不同类型的事物,变量也就有了不同的类型。
4). 事物总是有产生到消亡的一个过程,因此,代表事物的变量,也就有了生命期。计算机科学,是一门将时间转换成空间的科学。在程序中,我们把变量的生命期,称之为变量的作用域。
变量名,变量值,变量类型,变量的作用域,是我们学习命令式语言不可回避的几个要素。
如果你是一门编程语言的设计者,仔细考虑一下,上面四个要素,对于编程语言的使用者都是必须的吗?
作为一个使用者,1).  2). 是必须的。至于类型、生命期,与我何干?某个变量,我使用一下就丢弃了,要我操心太多,还不如我从头设计呢。
由编译内核(或解释内核)在运行时刻来判断变量类型的语言,叫动态类型语言。
变量既然是代号,那么可以代表数字,文字(字符串),代码序列(块,闭包),一段程序(文件)…在运行中,变量能够随时代表不同的事物,而不管事物是什么类型,这种语言,叫弱类型语言。这里的“弱”,是指弱化了类型的概念,不理会类型的差异。
Ruby 语言还是有基本类型。至于变量作用域,纯粹的函数式语言中是没有这个概念的。Ruby 中是有变量作用域概念的,还记得变量名前缀字符吗?实际应用中,有时会比较复杂,使用闭包时就知道了。
Ruby 语言中,一切都是对象,变量是不是对象呢?变量不是对象,变量只是引用某个对象的时候,你看到的一个代号而已。
Ruby 是动态类型语言,不用给任何变量指定数据类型,解释器会在你第一次赋值给变量时,在内部将数据类型记录下来。请看程序E5.3-1.rb :

ruby 代码

  1. #   E5.3-1.rb       
  2. a=5   
  3. b="hh"  
  4. puts  "a = #{a}"  
  5. puts  "b = #{b}"  

运行结果:
>ruby E5.3-1.rb
a = 5
b = hh
>Exit code: 0 


Ruby 语言中,一个变量被赋予了某个数据类型的值,在程序中你可以随时再赋予这个变量其它数据类型的值。请看程序 E5.3-2.rb :

 ruby 代码

  1. #   E5.3-2.rb       
  2. a=5   
  3. print "a = ",a,"    ", a.class"\n"  
  4. a="hh"   # a: 5 --> "hh"   
  5. print "a = ",a,"    ", a.class"\n"  

 运行结果:
>ruby E5.3-2.rb
a = 5    Fixnum
a = hh    String
>Exit code: 0


相对于 Java, Ruby 对于变量的使用给予了你很大的自由。在 Java 中,编译的时候,就完成了类型匹配的检测,这属于前期绑定; Ruby 是在运行中检测,检测类型匹配吗?不是检测类型匹配,而是检测语法,只要与语法定义不矛盾,就能通过。 Ruby 的动态类型特点是一把双刃剑,熟手游刃有余,生手常常伤着自己。在没有了编译器查错的日子里,又没有完全驾驭 Ruby 之前,如何避免常常出错呢?有一个下口之处,就是死盯住变量的命名。用一些有意义的名字,不必太长,但是应该少用单字符,除非是循环指针变量。你也许认为我自己能看懂就行了,这是十分有害的想法。在一个项目组中,程序员是要彼此相互沟通合作的。当坏习惯养成后,要改是很难的。

完整阅读,请看我写的 Ruby语言中文教程all in one    
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值