《Ruby语言入门教程v1.0》
编著:张开川
邮箱:kaichuan_zhang@126.com
想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一个简单的ppt做讲解,可能是因为我们需要使用到的并不多吧,不过既然要用,而且反正没谈恋爱的人最多的就是时间了,就好好看看这个吧。现在学习的这个教程。。说实话我也忘了是从哪儿捞来的了,不过既然ruby语言基本没什么出书的,就直接用这个吧。除了这个以外,还辅助这个网站来学习(http://www.yiibai.com/html/ruby/),好吧我承认,这个也是我今天才找到的,没有验证过好坏,万一不好用的话,嗯哼,以后再删了呗~
2013.9.3
第一章 概述
“从语义方面来看,人类语言的单词量非常大,要以万计,常用单词也有几千;计算机编程语言的基本单词只有几十个,我们称之为关键字。”从文中的这一句来看,似乎编程易乎其易,我却实在不敢大意啊。
感觉,概述里面除了对ruby特性的描述以外,对于ruby其他的分析介绍并不多,不过第一部分的“编程语言的发展简史”挺有意思的,所谓第一代编程语言“0,1”,第二代编程语言“汇编语言”是使“程序员之间能够很容易地交流”,第三代编程语言在于“容易编写,容易阅读,容易交流,而且可以与CPU、操作系统无关”,第四代编程语言,在于“你只要告诉它你要什么,无须告诉它怎么做,它就能把答案给你”。当然,这里的ruby是属于第三代编程语言的。
作者解释说“Ruby 吸取了 perl 的正则表达式, python 的简单性可读性,smalltalk 的纯面向对象语法和单继承,LISP 的无穷嵌套的语法,Java的线程…”,以此来说明ruby的特性,但我不得不说,我都不认识啊!!!!!!!!好吧,在“1.4 Ruby的特性”这一部分,以前看到所谓特性、优缺点,只想着背下来背下来啊,现在则开始思考了,所谓特性也是根据它本身的功能所总结出来的,那么,原理是什么呢?╭(╯^╰)╮你以为你告诉我它叫张三我就真记得真认识它是张三啦!
ps:感慨,其实一门语言也不过是名码农创造出来的,平时的我们却把这些想的高高在上难乎其难,不过是自己的躲懒而已。
第二章 安装ruby
Ruby语言的集成开发环境: 目前我用的ruby s 1.8.7 不过没有找到所说的1.8.5上有的代码编辑工具SciTE,去哪儿找啊???
而且第三个小程序我还没完成啊 !我一定要知道这是为什么!!!(已解决,2013-09-17)
copy con hello.rb (c:\ruby下)
print “hello world”
print “ 3*7=”,3*7
^Z
ruby hello.rb
小mark:
ruby –v 检查ruby版本号
输入 ruby –e ‘print “hello,world” ’ ,
ruby 的意思:运行这个ruby语言程序;
-e 的意思:把后面的一行脚本作为一个ruby程序;
print 的意思:打印(动作);
hello,world 的意思:这是我们要输出的内容。
2013.9.16
第三章 语法快览
3.1 注释与分行
函数说明、类说明应该放置在 =begin 和 =end 之中。“=begin”一定要写在行首,也就是说,这一行的前六个字符是“=begin”,不允许有空格在这之前。
#从#开始到行尾是单行注释
=begin
中间部分可进行多行注释
=end
Ruby中用分号“;”来表示一个语句的结束。一行如果有多个语句,每个语句用分号隔开,而最后一个语句可以省略分号。
换行符表示一行结束。如果语句太长,可以用“\”连接下一行。
疑问:输入一下信息,表示新建了一个test1.rb的文件,但是输入完信息后,怎么结束输入???目前我只能关掉cmd窗口来终止信息的输入。(按Ctrl+Z出现“^Z”的符号,按回车,就成功保存了)
C:\Windows\System32>cd c:\ruby
c:\Ruby>copy con test1.rb
# test1.rb 从#开始到行尾是单行注释
puts 3/5;puts 3/5.0;puts "这里演示"\
"连行"
^Z
=begin
puts 6/5;puts 6/5.0
多行注释。实际上,这也是Ruby的内嵌文档(Rdoc)注释,可以用命令ri从源文件产生文档。
=end
这里是执行test1.rb的文件,查看程序运行结果
c:\Ruby>ruby test1.rb
0
0.6
这里演示连行
3.2 ruby中常用分隔符
符号 | 名称 | 用途 |
; | 分好 | 用来分隔一行中的多个语句 |
() | 圆括号 | 提高优先级;定义方法时容纳参数列 |
空格 | 分隔字符;在可省略()的地方,代替() | |
, | 逗号 | 隔开多个参数 |
. | 点 | 将对象与它的方法隔开 |
:: | 紧连的两个冒号 | 域作用符,将模块(类)与它的常量隔开 |
3.3 关键字
类型 | 名称 |
模块定义 | module |
类定义 | class |
方法定义 | def , undef |
检查类型 | defined? |
条件语句 | if , then , else , elsif ,case ,when ,unless |
循环语句 | for ,in ,while ,until ,next, break ,do ,redo ,retry ,yield |
逻辑判断 | not ,and ,or |
逻辑值和空值 | true ,false , nil |
异常处理 | rescue ,ensure |
对象引用 | super ,self |
块的起始 | begin/end |
嵌入模块 | BEGIN ,END (备注:BEGIN模块相当于C语言中的宏, END模块用来作一些收尾工作。有了require,include,应该取消BEGIN和END的语法定义。) |
文件相关 | __FILE__ , __LINE__ |
方法返回 | return |
别名 | alias |
3.4 运算符
优先级 | 能否重写 | 运算符 | 描述 |
最高 | Y | [] []= | 数组下标;数组元素赋值 |
Y | ** | 乘幂 | |
Y | ! ~ + - | 非;位非;一元加;负号 | |
Y | * / % | 乘;除;模 | |
Y | >> << | 右移,左移 | |
Y | & | 位与 | |
Y | ^ | | 位异或;位或 | |
Y | <= < > >= | 小于等于;小于;大于;大于等于 | |
Y | <=> == === =~ != !~ | 各种相等判断(!= 及 !~ 不能重写)(这两个不能一起,还是他们各自不能写两个?) | |
&& | 短路与 | ||
|| | 短路或 | ||
.. ... | 区间的开始点到结束点 | ||
?: | 三元条件运算符 | ||
= %= ~= /= -= += |= &= >>= <<= *= &&= ||= |**= |
各种赋值,例如:a=5;b+=3(意思是b=b+3) | ||
defined? | 检查类型 | ||
not | 逻辑非 | ||
or and | 逻辑或;逻辑与 | ||
if unless while until | 判断与循环 | ||
最低 | begin/end | 定义方法、类、模块的范围 |
3.5 标识名和变量的作用域
标识名的首字符用来帮助我们确定标识所指向内容的作用域。
Ruby的标志名区分大小写。
Ruby使用一个约定来帮助它区别一个名字的用法:
名字前面的第一个字符表明这个名字的用法。
局部变量、方法参数和方法名称应该用一个小写字母开头或者用一个下划线开头;
全局变量用美元符作为前缀 $;
实例变量用 @ 开头;
类变量用 @@ 开头;
类名、模块名和常量应该用大写字母开头。
词首字母后面可以是字母、数字和下划线的任意组合;@后面不可以直接跟数字。
3.6 类库
一门编程语言,A)关键字可以直接使用;
B)还有其它常用的应用程序,我们将它们放在一个专门的目录下,称为类库(许多类的仓库)。
如果当前程序要用到类库中某个程序已经定义好的类、方法,就应该使用 require 或者 include 将类库程序名包含在当前程序中。
C)从父类继承得到的方法可以直接使用。
ruby的I/O库很完善,这里介绍了几个输入输出的方法:
puts 把它的所有参数写出来,每一个参数结束都加入一个换行符,
print 也写出它的参数,不过没有换行。
printf 它按格式输出参数,不主动换行,换行可以用“\n”。
例:printf "Number: %4.3f, String: %s", 7.8, "hi!"
输出为“Number: 7.800, String: hi!”(表示printf用一个浮点数(总共允许4位,小数点后3位)和一个字符串来代替。)
但是我这里显示的是“Number: 7.800, String:hi!=> nil”又是一个问题,何解?
gets 它从你的程序的标准输入流中返回一行。一般用来从键盘或文件读入一行数据。
参考:http://blog.sina.com.cn/s/blog_5d2dc2e50100ha6a.html
3.7 数据类型
Ruby 数据类型有数字,字符串,数组,哈希表,区间,正则表达式。
数 字:整数型(1,0,75 ,1e3)。数字可以有前缀:0表示八进制, 0x表示十六进制, 0b表示二进制(0724,0x5AC4,0b11101)。
浮点型(2.4 ,7.0 ,0.99)。浮点型数据小数点后必须跟数字( 1.e3 不可以,1.1e3可以)。
字符串:是在‘ ’(单引号)、 “ ”(双引号)之间的代码。
数 组:数组的下标从0开始。Ruby的数组和其它语言不同,数组的每个元素可以是不同的类型:[ 2.4, 99,“thank you”,[ a, b ,c ] ,78 ]。
区 间:1..5 表示1,2,3,4,5 ;
1...5表示1,2,3,4 。
未对哈希表和正则表达式进行说明
3.8 赋值和条件运算符
这里就扯到之前说的运算符了啊,不得不说,这么多杂七杂八的运算符加在一起。。。真麻烦啊。。。。。。
列出部分吧啊
符号 | 结果 |
== (等于) |
比较两个对象的值是否相等 ,返回 true, flase |
eql? |
比较两个对象的值、类型是否相等,返回 true, flase |
equal? |
比较两个对象在内存中地址是否相同,返回 true, flase |
<=> |
比较两个对象的大小,大于、等于、小于 分别返回1,0,-1 |
=== |
右边的对象是否在左边区间之内,返回 true, flase |
=~(匹配) | 用来比较是否符合一个正则表达式,返回模式在字符串中被匹配到的位置,否则返回 nil |
!~ (不匹配) | 断言不符合一个正则表达式,返回 true, flase |
<= < > >= | 数值小于等于 小于 大于 大于等于 |
3.9 条件判断语句
判断条件是否相等用“==”,注意不要写成“=”。
一. 单行 if(如果)语句
1) if 条件 2)( 语句1;
then 语句1; 语句2 ;
语句2 ; 语句… )
语句… if 条件
end
Ruby里,nil 和 false 为假,其它都为真; puts "is true" if 5 #is true
str="false" ; puts "is true" if str #is true
二. 多行 if 语句
if 条件
语句1; 语句2 ; 语句…
elsif 条件
语句1; 语句2 ; 语句…
else
语句1; 语句2 ; 语句…
end
三. unless(除非) 条件语句:
unless与if完全相反,是在条件不成立的情况下执行语句
unless 条件
then 语句
end (这里是只,只有当条件不成立的时候,才能去执行语句)
四. case分支条件语句
case 对象 | case x
when 可能性1 。 when 1..2
语句1; 语句2 ; 语句… | print "x=",x,";在 1..2中"
when 可能性2 。 when 4..9, 0
语句1; 语句2 ; 语句… | print "x=",x,";在4..9,0中,或是0"
when 可能性… 。 else
语句1; 语句2 ; 语句… | print "x=",x,";其它可能"
else 。 end
语句1; 语句2 ; 语句… | 例子:x=3
end 。 结果:x=3;其它可能
P.S:在if、unless、case语句中,then可省略
在case表达式中,判断与when后指定的值是否一致可用”===”(3个等号)运算符表示。若”===”左边是数值或字符串,则意义与”==”一样;在正则表达式的场合下相当于”=~”,即匹配判定;在类的场合下,判断”===”右边的对象是否是类的实例
3.10 循环语句
一. while(当…) 循环
while 条件
语句1; 语句2 ; 语句…
end
二. 单行 while 循环
( 语句1; 语句2 ; 语句… ) while 条件
三. until(直到…) 循环
until 条件 = while not (条件),until是在条件不成立时才执行语句
a=1
until a >=10
print a," "
a=a+1
end #1 2 3 4 5 6 7 8 9
四. for…in 循环
for 变量 in 对象
语句1; 语句2 ; 语句…
end #当变量是属于对象的时候,执行语句
对象可以是数组,区间,集合…
五.break , next & redo & retry
在循环体内,如果遇到:
break ,跳出当层循环;
next ,忽略本次循环的剩余部分,开始下一次的循环;
redo ,重新开始循环,还是从这一次开始;(差点理解成从第一次循环开始啊,幸好把所有的例子都看了一遍,阿弥陀佛)
retry ,重头开始这个循环体(从第一个循环开始,ps:注意赋值的保存)。
六. times , upto , downto , each ,step
3.times { print "Hi!" } #Hi!Hi!Hi! 执行N次
1.upto(9) {|i| print i if i<7 } #123456 限定顺序为升序
9.downto(1){|i| print i if i<7 } #654321 限定顺序为倒序
(1..9).each {|i| print i if i<7} #123456 限定区间范围
0.step(11,3) {|i| print i } #0369 (这个不懂啊)
http://blog.sina.com.cn/s/blog_5d2dc2e50100ha6s.html
3.11 线程与异常
mark 暂时不学