先看一句代码:
ruby 代码
(1..9).each {|i| print i if i<7} # =>123456
迭代器each 是数组类的一个方法;大括号{ }里的代码是代码块,简称块。你可以用大括号{ }将代码组织成块,也可以用 do…end将代码组织成块。大括号{ }的优先级高于do…end。
...
一本入门小书,不想涉及正则表达式,但是正则表达式与Ruby语言联系如此紧密,总让人感觉绕不开它。所以匆匆结束字符串的介绍,边学边说正则表达式。
正则表达式之强大、复杂,由来已久。自从1956年提出了“正则集代数”,正则表达式就逐渐被广泛地应用于操作系统,编程语言,算法设计,人工智能……
现在,除了Perl这样支持强大正则表达式功能的语言之外,Java,JavaScript, C# 等语言都纷纷支持正则表达式,只不过支持的程度不同。而Ruby正是一种强烈而灵活地支持正则表达式的语言。
下面,我努力尝试尽可能简单地描述Ruby中的正则表达式 ...
一. 生成一个字符串
字符串是String类的对象,一般使用字面值来创建。
ruby 代码
#E8.2-1.rb
str1 = 'this is str1'
str2 = "this is str2"
str3 = %q/this is str3/ ...
一. 建立一个数组
ruby 代码
#E8.1-1.rb
arr1=[]
arr2=Array.new
arr3=['4 ','5 ','6 ']
print arr1, "\n"
print arr2, &quo ...
程序 E7.3-1.rb中先写了Me模块,然后include Me模块,实现了Mix-in功能,但是,这样没能做到代码复用。
我将 Me模块写在文件 E7.4-1.rb中,将 Person类写在文件 E7.4-2.rb中,这时候 Student类如何使用 Me模块和 Person类呢?这里要用到require方法。
看程序 E7.4-3.rb :
ruby 代码
#E7.4-3.rb
require "E7.4-1"
require ...
糅和,也译作混合插入,也许就称作 Mix-in 比较合适。
现实生活中,一个乒乓球不仅是球类物体,也是有弹性的物体。 C++ 支持多重继承,多重继承有时会导致继承关系的混乱,Java只提供了单继承,通过接口可以得到多重继承的优点,又没有多重继承的缺点。Ruby 也是单继承,不是通过接口,而是通过Mix-in 模块,来实现多重继承的优点。
模块的第三个作用:实现了类似多重继承的功能。
我们有一个Student类,有着Person类的属性和方法,还会做数学题——求平方根。已经有了Me模块,只要Mix-in 在Student类里就可以了。
看程序 E7.3-1.rb ...
7.1 模块
我们常常把许多零散的小物件放在一个盒子里,或者放在一个抽屉里,这些小物件可能是铅笔,墨水,字典等学习用品,也有可能是不相关的几件物品。在程序中,相关的、不相关的代码的组合,叫作模块。一般情况下,我们总是把功能相关的代码放在一个模块里。
把功能相关的程序代码放在一个模块里,体现了模块的第一个作用:可以被其它程序代码重复使用。
看程序 E7.1-1.rb :
ruby 代码
#E7.1-1.rb
puts Math.sqrt(2) &nb ...
在Ruby里,要读取,或是改变对象的属性,唯一的途径是调用对象的方法。控制了对方法的访问,也就控制了对对象属性的访问。
控制对方法的访问,有三种方式:
访问控制
意义
public
可以被任何实 ...
学习编程的过程,就是深化理解变量的过程。在面向对象编程中也不例外,这一节,我们继续深化理解变量。
先把 Ruby 放在一边,从编程语言的视角来探讨变量。
如果一个变量,第一次赋值后,就不再允许改变变量值,这样的变量称之为常变量,简称常量。就像数学分析中的常函数,y = 3 是一个平行于 x 轴,并且函数值总是为 3 的函数。常量名用大写字母开头。
如果一个变量,在其作用域上的每一个执行点,都可以改变变量值,这样的变量称之为可变量,简称变量。
如果一个变量,其作用域遍及在程序的任何位置,这样的变量称之为全局变量;与之相对,作用域仅限于在程序的某一单元的变量,称之为局部变量。
面向对象的编程,以类 ...
同一份设计蓝图(类),不同的实例对象,可以表现出不同的行为特征,这种(不牵涉继承的)多态性在Java 这样的静态语言里,通过方法重载得到具体实现。6.1节中我们分析知道了Ruby中的重载是指重写,Ruby 如何来反映不同实例对象的不同行为特征呢?
在Ruby里,可以给具体的实例对象添加实例方法,这个方法只属于这个实例对象,我们把这样的方法称之为单例方法。
看程序 E6.4-1.rb :
ruby 代码
#E6.4-1.rb
class Person   ...
如果我们只是想增强父类的方法,而不是完全地替代它,就可以用关键字super指明。看程序 E6.2-1.rb :Person类的talk方法只是报告姓名。 Student类的talk方法用super来调用Person类的talk方法,报告姓名;随后又加上了一条语句,来表明身份。
ruby 代码
#E6.2-1.rb
class Person
def talk(name)
&n ...
在Java 中,重载(overload)和重写(override)是用来表现多态性的两种重要方式。override 也有译作“覆盖”、“覆写”。Java 中称作“覆写”比较恰当。
重载方法是指一个类中,方法名相同、参数列表不同的几个方法,调用时根据不同的参数调用不同的方法。方法重载与返回类型无关。
覆写方法是指子类有一个方法,方法名、参数列表、返回类型与父类的某个方法完全一致。调用时会调用子类的方法,而屏蔽掉父类的同名方法。需要注意的是,子类覆写的方法,其可访问性一定要强于或等同于,父类被覆写的同名方法。
覆写发生在 ...
这里不是 Ruby语言的编码约定,只是建议,很少的一些建议。在语法正确的前提下,你可以按照自己的编码风格自由组织你的代码。
一. 命名
常量全用大写的字母,用下划线分割单词。例如:MAX, ARRAY_LENGTH。
类名和模块名用大写字母开头的单词组合而成。例如:MyClass, Person。
方法名全用小写的字母,用下划线分割单词。例如:talk, is_prime?。在Ruby里,有时将“!”和“?”附于某些方法名后面。惊叹号“!”暗示这个方法具有破坏性, 有可能会改变传入的参数。问号“?& ...
Ruby 是动态语言,你可以改变 Ruby 程序的结构,功能,在Ruby程序运行中。方法、属性可以被加入或去除,新的类或对象可以被建立,新的模块可以出现。请看程序 E5.4-1.rb :
ruby 代码
# E5.4-1.rb
class Person
def talk
  ...
变量是什么?变量有哪些特征呢?学习编程的过程,就是深化理解变量的过程。
先说变量是什么?变量是代号。
在数学中,你写下一个小写的英文字母“ f ”,这个 f 可以是数字 5 ,也可以是一个函数式 f = n * n + 1 ,还可以是一个曲面,或者是一个逻辑蕴涵关系…数学里,我们把常用的符号约定俗成,比如π代表圆周率,∑表示求和。
编程语言的产生,建立在数学的基础上。在汇编语言的时代,一条语句
LD x,37H ,
其中的 LD 是操作码,代表一种操作;x 和 37H 是操作数,是被操作的对象。无论是 LD ...
5.1 为什么是Ruby?
现在软件生产的代表语言是Java。但Java已老,在主流市场,虽然它还会将继续存在许多年。
为什么说Java已老?很怀念Pascal的严谨、优美与高效。Java也一样,是静态语言,沉稳的同时注定了笨重,不善腾挪;而且Java是强静态语言,在需要简略的地方,依然沉稳笨重。仿佛一个绅士,在宴会大厅中彬彬有礼,在厨房里彬彬有礼,在卧室里仍然彬彬有礼。灵气沾不上Java,神来之笔沾不上Java。这一切,注定了Java与软件的快速开发无缘。
为什么不是C++,C#?从C++开始,C系列语言已经走上一条不归路。C++不仅兼容C,而且囊括了模板、范型等特性,包罗 ...
不同的子类继承一个父类,不仅子类和父类的行为有变异,而且子类彼此的行为也有差异,这就是多态。看程序 E4.5-1.rb ,接着4.3节的代码,添加如下:
ruby 代码
class Worker < Person
def talk
puts "I am a worker. my&nbs ...
如果我们要写一个学生类,他当然有姓名、年龄、国籍,他也可以talk,但是应该表明身份是学生。看程序 E4.4-1.rb ,接着上一节的代码,添加如下:
ruby 代码
class Student < Person
def talk
puts "I am a student. my nam ...
让我们来定义一个类,类名是Person,类名首字母要大写;属性有姓名@name、年龄@age、国籍@motherland,实例变量用@开头; 方法有一个,叫talk, 方法名和参数名应该用一个小写字母开头或者用一个下划线开头,看程序 E4.3-1.rb 。#=>my name is kaichuan, age is 20
I am a Chinese.
my name is Ben, age is 18
I am a foreigner.
@age.to_s的含义是:将数@age转换为字符串。
initialize是初始化方法,相当于J ...
4.1 两种思维方式
人们起初使用计算机来进行科学计算,比如说:计算级数和,计算积分值。那时,程序要处理的都是带小数点的数字。后来,人们要处理文本,有点麻烦,好在文字也可以转换成数字。这两个时期,编写程序的思想是:一个步骤,一个步骤地告诉计算机如何做,做完一大段步骤,就算完成了一个功能模块。
再后来,人们希望计算机能应用在管理中。比如说:机场管理。一个大都市的民航机场,每天有上千架飞机起落,乘客上万,行李、包裹无数,乘务、地勤人员上千,安检信息上万,气象信息上万……这样百万、千万的数据要及时处理,靠旧的编程思维是无法实现的。
为了应付越来越复杂的管 ...
还是求50以内的素数,尽可能地用到本章更多的语法,看程序 E3.12-1.rb ;
ruby 代码
# E3.12-1.rb 求50以内的素数
$arr=[ ] #建立一个全局数组 $arr
...
一. while(当…) 循环
while 条件
语句1; 语句2 ; 语句…
end
二. 单行 while 循环
( 语句1; 语句2 ; 语句… ) while 条件
三. until(直到…) 循环
我们想输出数字1到9,看程序 E3.10-1.rb,E3.10-2.rb :
a=1
while&nb ...
判断条件是否相等用“==”,注意不要写成“=”。
一. 单行 if(如果) 语句
1) if 条件① then 语句1; 语句2 ; 语句… end
2) (语句1; 语句2 ; 语句… ) if 条件
二. ...
Ruby 基本的赋值用 “ = ” 来完成,就像 E3.8-1.rb 如下示例:(在不产生歧义的地方,我用 # => 表示答案)
ruby 代码
a = 1 ;b = 2 + 3 # => a=1 ,b=5 ...
3.5 标识名和变量的作用域
Ruby的标识名用来指向常量,变量,方法,类和模块。标识名的首字符用来帮助我们确定标识所指向内容的作用域。一些标识名,就是上面所示的关键字,不能用来当作常量,变量,方法,类或模块的名字。
Ruby的标识名区分大小写。
Ruby使用一个约定来帮助它区别一个名字的用法:名字前面的第一个字符表明这个名字的用法。局部变量、方法参数和方法名称应该用一个小写字母开头或者用一个下划线开头;全局变量用美元符作为前缀 $;而实例变量用 @ 开头;类变量用 @@ 开头;类名、模块名和常量应该用大写字母开头。
词 ...
3.2 分隔符
关键字、运算符、分隔符一起构成了一门编程语言的基本定义。3.2 、3.3 、3.4节分别对分隔符、关键字、运算符作一些介绍。如果有不详细的地方,将在本书后面部分介绍;或者是因为这些不常用到;还有一种情况是:可以被其它常用语法定义代替。
Ruby中的常用分隔符如下:
符号
名称
用途
...
Ruby中的注释有单行与多行两种,先看一个程序E3.1-1.rb:
ruby 代码
# E3.1-1.rb 从#开始到行尾是单行注释
puts 3/5
puts 3/5.0
=begin
puts 6/5   ...
你如果只是想了解Ruby语言,不准备实践,请跳过本章,从第三章开始我们的Ruby语言之旅。
2.1 下载Ruby 1.8.5
首先下载Ruby 1.8.5(2006-8-25) for Windows:
在网页http://www.rubychina.net/downloads/ 上找到
--〉Ruby on Windows
--〉Ruby 1.8.5 One-Click Installer Stable version (recommended)
点击鼠标右键,另存为…,存入你的本地硬盘,这就完成了下载。
2.2 安装R ...
1.1 编程语言的发展简史
本小节是一些编程语言的简单介绍,你如果不感兴趣,可以略过不看。
先说程序是什么?程序就是指令序列的有序集合。指令即代码,可以是数字,也可以是文字,文字最终要转换成数字。也就是说,程序是许多数字串,当然,也可以合并成一个很长很长的数字串。
程序的作用是什么?程序能够做事,做你想叫它做的事。换一种说法,程序的功能是完成它的使命。它的使命由编写程序的人来决定,或者由编写程序的程序来决定。
编写程序就是写文章,写能够转换成很长很长数字串的文章,给计算机看。
最初的计算机编程语言是一长串二进制代码。所谓的二进制就是只有1和0,所以第一代的计算机编程语 ...
有同学表示第九章元编程的例程不好理解。先道歉,因为能力不足于游刃有余地表达元编程的方方面面,所以我选择了只演示最简单的元编程,而不展开解释。
下面给出例程的一点注释,不保证你能理解。对于入门,知道Ruby长于元编程就可以了。
ruby 代码
class MetaPerson
def MetaPerson.method_missing(methodName, *args) #重新定义Ruby内置的方法method_missing
name = methodName.to_s
...
- 浏览: 48129 次
- 性别:


- 详细资料
搜索本博客
最近加入圈子
最新评论
-
3.1 注释与分行
正想知道ruby是怎么样生成像javadoc那样的文档,多谢了.
-- by yangzhihuan -
变量一定要有类型吗(一)
从lambda演算的角度说我们并不关心一个东西到底是什么,而只看作一个符号并定义 ...
-- by whisper -
变量一定要有类型吗(一)
这个问题还需要讨论啊!...无语了...
-- by wiwolf -
变量一定要有类型吗(一)
假设若干年后,有一篇搜索引擎报告指出:A)21世纪初期,网络信息以中文和英文居多 ...
-- by dustinth -
变量一定要有类型吗(一)
more: http://en.wikipedia.org/wiki/Type ...
-- by aardvark






评论排行榜