- 浏览: 83705 次
- 性别:
最近访客 更多访客>>
最新评论
-
Bernice_liu:
谢谢分享,受益匪浅,适合我——初学者
Ruby语言中文教程all in one -
何枫abc:
怎么感觉Ruby有点像C!!!
3.5 标识名和变量的作用域 3.6 类库 3.7 数据类型 -
何枫abc:
谢谢了!!!你写的很好,现在我正在学Ruby!!!
第二章 运行环境 -
yangzhihuan:
正想知道ruby是怎么样生成像javadoc那样的文档,多谢了 ...
3.1 注释与分行 -
whisper:
从lambda演算的角度说我们并不关心一个东西到底是什么,而只 ...
变量一定要有类型吗(一)
变量是什么?变量有哪些特征呢?学习编程的过程,就是深化理解变量的过程。
先说变量是什么?变量是代号。
在数学中,你写下一个小写的英文字母“ 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 代码
- # E5.3-1.rb
- a=5
- b="hh"
- puts "a = #{a}"
- puts "b = #{b}"
运行结果:
>ruby E5.3-1.rb
a = 5
b = hh
>Exit code: 0
Ruby 语言中,一个变量被赋予了某个数据类型的值,在程序中你可以随时再赋予这个变量其它数据类型的值。请看程序 E5.3-2.rb :
ruby 代码
- # E5.3-2.rb
- a=5
- print "a = ",a," ", a.class, "\n"
- a="hh" # a: 5 --> "hh"
- 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
发表评论
-
8.4 迭代器、代码块、闭包
2007-02-13 06:25 1766先看一句代码: ruby 代码 (1..9). ... -
8.3 正则表达式
2007-02-13 06:13 1559一本入门小书,不想涉及正则表达式,但是正则表达式与Ruby语言 ... -
8.2 再说字符串
2007-02-13 06:07 1340一. 生成一个字符串 字 ... -
8.1 再说数组
2007-02-13 06:03 1466一. 建立一个数组 ruby 代码 #E8.1- ... -
7.4 require 和 load
2007-02-13 05:59 1357程序 E7.3-1.rb中先写了Me模块,然后include ... -
7.3 糅和(Mix-in) 与多重继承
2007-02-13 05:55 1806糅和,也译作混合插入,也许就称作 Mix-in 比较合适。 现 ... -
7.1 模块 7.2 命名空间
2007-02-13 05:50 22417.1 模块 我们常常把许 ... -
6.5 访问控制
2007-02-13 05:43 1174在Ruby里,要读取,或是改变对象的属性,唯一的途径是调用对象 ... -
6.4 单例方法
2007-02-13 05:16 1038同一份设计蓝图(类),不同的实例对象,可以表现出不同的行为特征 ... -
6.3 实例变量、类变量、类方法
2007-02-13 05:28 2273学习编程的过程,就是深化理解变量的过程。在面向对象编程中也不例 ... -
6.2 增强父类方法
2007-02-13 04:39 1028如果我们只是想增强父类的方法,而不是完全地替代它,就可以用关键 ... -
6.1 重载?重写
2007-02-13 04:11 1926在Java 中,重载(overload)和重写(overrid ... -
5.5 一些编码建议
2007-02-13 03:37 1138这里不是 Ruby语言的编 ... -
5.4 蓝图可以改变吗? ——动态语言
2007-02-13 03:28 774Ruby 是动态语言,你可以改变 Ruby 程序的结构,功能, ... -
5.1 为什么是Ruby? 5.2 Ruby会长久么?
2007-02-13 03:16 10155.1 为什么是Ruby? 现 ... -
4.5 多态
2007-02-13 03:07 795不同的子类继承一个父 ... -
4.4 继承
2007-02-13 03:04 836如果我们要写一个学生 ... -
4.3 封装
2007-02-13 02:53 929让我们来定义一个类,类名是Person,类名首字母要大写;属性 ... -
4.1 两种思维方式 4.2 对象
2007-02-13 02:47 9304.1 两种思维方式 人们 ... -
3.11 一个综合小练习
2007-02-13 02:05 1024还是求50以内的素数,尽可能地用到本章更多的语法,看程序 E3 ...
相关推荐
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 无序...
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 ...
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 ...
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编程 ...
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_...
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 知识点详解 #### 第1章 JSP简介 - **1.1 什么是JSP** - JSP(JavaServer Pages)是一种基于Java技术的服务器端脚本语言,用于生成动态网页内容。它允许在HTML页面中嵌入Java代码,从而...
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 通用对话框类 ...
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中文件及文件...
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...
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 ...
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 ...
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 ...
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 ...
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 ...