`
凌川__
  • 浏览: 83285 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

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    
 

分享到:
评论

相关推荐

    从入门到精通HTML5——PDF——网盘链接

     3.5.2 声明变量标记——var 61  3.5.3 忽视HTML标记  ——plaintext、xmp 62  3.6 小结 63  3.7 习题 63  第4章 使用列表 65  教学录像:35分钟  4.1 列表的标记 66  4.2 使用无序列表 66  4.2.1 无序...

    TCP-IP详解卷2:实现——2

    5.3 SLIP接口 101 5.3.1 SLIP线路规程:SLIPDISC 101 5.3.2 SLIP初始化:slopen和slinit 103 5.3.3 SLIP输入处理:slinput 105 5.3.4 SLIP输出处理:sloutput 109 5.3.5 slstart函数 111 5.3.6 SLIP分组丢失 116 ...

    TCP-IP详解卷2:实现——1

    5.3 SLIP接口 101 5.3.1 SLIP线路规程:SLIPDISC 101 5.3.2 SLIP初始化:slopen和slinit 103 5.3.3 SLIP输入处理:slinput 105 5.3.4 SLIP输出处理:sloutput 109 5.3.5 slstart函数 111 5.3.6 SLIP分组丢失 116 ...

    嵌入式Linux应用程序开发详解

    153 5.2.2 U-Boot概述 155 5.2.3 U-Boot源码导读 156 5.2.4 U-Boot移植主要步骤 163 5.2.5 U-Boot常见命令 164 5.3 实验内容——移植Linux内核 164 本章小结 165 思考与练习 165 第6章 文件I/O编程 ...

    性能测试进阶指南——LoadRunner11实战 part2

    3.6.8 参数和变量 3.7 关联 3.7.1 关联原理 3.7.2 自动关联 3.7.3 手动关联 3.7.4 一边录制一边关联 3.7.5 关联函数web_reg_save_param_ex详解 3.7.6 关联函数web_reg_save_param_regexp详解 3.7.7 关联函数web_reg_...

    性能测试进阶指南——LoadRunner11实战 part1

    3.6.8 参数和变量 3.7 关联 3.7.1 关联原理 3.7.2 自动关联 3.7.3 手动关联 3.7.4 一边录制一边关联 3.7.5 关联函数web_reg_save_param_ex详解 3.7.6 关联函数web_reg_save_param_regexp详解 3.7.7 关联函数web_reg_...

    JSP教程——必看.pdf

    ### JSP教程——必看.pdf 知识点详解 #### 第1章 JSP简介 - **1.1 什么是JSP** - JSP(JavaServer Pages)是一种基于Java技术的服务器端脚本语言,用于生成动态网页内容。它允许在HTML页面中嵌入Java代码,从而...

    Visual C++ 6.0编程实例详解.part1

    3.3 AppWizard——生成结果 3.3.1 分类 3.3.2 传递和接收 3.3.3 处理 3.4 实例 第4章 对话框及控件 4.1 对话框 4.1.1 组成与分类 4.1.2 CDiaiog类 4.1.3 创建对话框 4.1.4 通用对话框类 ...

    嵌入式Linux应用程序开发标准教程(第2版全)

    5.3 实验内容——创建Linux内核和文件系统 5.4 本章小结 5.5 思考与练习 第6章 文件I/O编程 6.1 Linux系统调用及用户编程接口(API) 6.1.1 系统调用 6.1.2 用户编程接口(API) 6.1.3 系统命令 6.2 Linux中文件及文件...

    TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议——高清文字(china-pub经典系列)

    5.3 sosend函数 56 5.4 小结 58 第6章 T/TCP的实现:路由表 59 6.1 概述 59 6.2 代码介绍 59 6.3 radix_node_head结构 60 6.4 rtentry结构 61 6.5 rt_metrics结构 61 6.6 in_inithead函数 61 6.7 in_addroute函数 62...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    性能测试进阶指南——LoadRunner11实战_(完整)扫描版_@vs.part1

    5.3 Graphs(数据图) 5.3.1 Vusers(虚拟用户状态) 5.3.2 Errors(错误统计) 5.3.3 Transactions(事务) 5.3.4 Web Resources(网页资源信息) 5.3.5 Web Page Diagnostics(网页分析) 5.3.6 Network ...

    性能测试进阶指南——LoadRunner11实战_(完整)扫描版_@vs.part2

    5.3 Graphs(数据图) 5.3.1 Vusers(虚拟用户状态) 5.3.2 Errors(错误统计) 5.3.3 Transactions(事务) 5.3.4 Web Resources(网页资源信息) 5.3.5 Web Page Diagnostics(网页分析) 5.3.6 Network ...

    性能测试进阶指南——LoadRunner11实战_(完整)扫描版_@vs.part5

    5.3 Graphs(数据图) 5.3.1 Vusers(虚拟用户状态) 5.3.2 Errors(错误统计) 5.3.3 Transactions(事务) 5.3.4 Web Resources(网页资源信息) 5.3.5 Web Page Diagnostics(网页分析) 5.3.6 Network ...

Global site tag (gtag.js) - Google Analytics