听人吵吵好久RUBY了,准备学习一下,翻了翻书(Programming Ruby 1.9,网上下载的)觉得这门语言还挺有意思决定把这个学习计划进行下去,也算为我无聊的生活注入点能量吧。在这里做一点读书笔记,算是对每一张的一个提纲,也有一些自己的思考,可能不成熟或者不对,大家给提提意见吧,也请各位前辈多帮忙小弟。在此先谢谢了。OK,让我们开始吧
我用的Ruby环境是:ruby 1.9.1p430,Windows XP
一、Ruby是OOL
在Ruby中,所有的东西都是对象,什么字符串啦、数字啦、数组啦、哈希表、正则表达式、还有符号(Symbol)等等的都是对象。有意思的是nil(类似于C语言中的NULL)也是对象,下面列举了一部分对象的例子,这些例子都是在irb验证的。
nil.class # NilClass
“fuck ass hole".class # String
100.class # Fixnum
100000000000000000000000000000000000000.class # Bignum
1.25.class # Float
/QQ|MSN/.class # Regexp(正则表达式)
[1,2,3,4,5].class # Array
{"CA" => "California"}.class # Hash
:north.class # Symbol
二、一些Ruby的简单例子
1、方法定义:
def say_hello(name)
"hello, #{name}"
end
(1)Ruby的方法由def ... end来界定,这跟C语言中用{}来界定不太一样,这种界定方法对我来说不错,因为我讨厌打怪怪的字符。
(2)def之后是方法名,这里是say_hello,方法名必须用小写且只能是数字、字母、下划线的组合,第一个字符不能是数字。
(3)括号中是参数列表,可以有任意多个参数,参数由于是Local的,所以必须也要用小写字母。
(4)如果没写return语句则方法的最后一条语句的值作为方法的返回值。
(5)在双引号的字符串中,像上边那样把变量放在字符串中就可以把它插入String了
注意:使用小写字母不是我个人的喜好,这是Ruby这门语言所规定的
2、puts
puts是Ruby标准库中的一个方法,用来将某些东西输出到一个地方,默认是标准输出
puts "Hello, World"
puts say_hello("someone")
在调用方法时不一定要加上括号,只不过加上以后看着比较清晰,上边的第二条也可以写成
puts say_hello "someone"
3、Ruby的变量
Ruby的变量是由字符、数字、下划线组成的,但是要遵循下边一点点小规则,变量名长度任意
@var_name # instance var,以@开头
@@var_name # class var,以@@开头
$globe_var # 全局变量以$开头
MyClass,MyModule,MyConstant # 类名、模块名、常量名,以大写字母开头
method_name, local_name, para_name # 方法名、本地变量、方法参数,以小写字母或下划线开头
4、Array和Hash
可以有两种方法定义Array和Hash
Array:
a1 = [1, "cat", 3.15, //] # Array,literal
a2 = Array.new(10) # Array,length is 10
当Array的所有元素为String时也可以用一种简写的语法
s = %w[cat dog]等价于s = ["cat", "dog"]
b1 = { "cat" => "cat", "dog" => "dog" } # Hash, literal
b2 = { :cat => "cat", :dog => "dog" } # Hash, literal, using Sysmbol
b3 = {cat:"cat",dog:"dog"} # 和b2一样,1.9的新语法
b4 = Hash.new(0) # Hash, default value is 0
Array和Hash的引用
引用Array很简单,类似于C语言中的数组,index从0开始(还有稍微复杂一点的以后再说)
a1[0] => 1
a1[1] => "cat"
a1[2] => 3.15
a1[3] => //
a1[4] => nil 不存在返回nil
b1["cat"] => "cat"
b2[:cat] => "cat"
b3[:cat] => "cat"
b4[:animal] => nil 值不存在
5、符号(Symbol)
就是用来为某些东西给一个名字,从作用上有点像#define,我们只需要知道其名字而不必关心它的值是多少。
:north
:east
:west
:south
都是Symbol的例子,当引用它们的时候也是用相同的语法,Ruby内部为他们分配值,但是这个值我们不必关心它。
我们可以在很多地方使用Symbol,比如:
if direction == :west
# ... TODO
end
在上边定义b2的时候就是使用了Symbol,由于使用Symbol定义Hash很普遍,Ruby1.9就有了b3使用的新语法(很像Python的Dict,我很喜欢,还是那个原因^_^)
6、条件句和循环
Ruby支持if条件和while循环,功能和C语言的差不多,只是语法上些许不同,看些例子吧。
i = 0
while i < 0
# TODO
i += 1
end
if x < 0
# TODO
end
上边的例子很好理解吧,就不多说了
如果if和while的body只有一条语句,可以用下边类似的写法
if x < 0
puts "x < 0"
end
puts "x < 0" if x < 0
while x < 5
x += 1
end
x += 1 while x < 5
在这一部分我遇到了点问题有点不解,用上述类似的语法,我在irb中试验了书里的两个例子,都OK,可是有一个例子不行,不知道为什么。
while line = gets
puts "#{line}"
end
puts "#{line}" while line = gets
7、正则表达式
Ruby中内建(built-in)支持正则表达式,同时它也是对象,类型是Regexp
正则表达式在//中界定,比如:/Python|Ruby/
=~ 方法将左边的String与右边的正则表达式匹配,如果匹配成功了则返回匹配成功的第一个字符的位置,否则返回nil
String类的gsub,sub方法提供根据正则进行查找替换的功能,gsub替换所有匹配的地方,sub一次只替换一次匹配的地方
(正则表达式看着怪怪的,感觉挺复杂的,但是貌似很有用,以后再慢慢学习吧)
8、Block和迭代器(Iterator)
Ruby中的Block其实就是C中用{}界定的代码块,但是Ruby的Block的功能很强大,这里知识简单介绍一下语法,以后有专门的章节说Block
首先说语法,Ruby的Block用{}和do...end来界定,且Block只能出现在方法调用之后,例如:
[1,2,3,4].each { puts "OK" }
[1,2,3,4].each do
puts "OK"
end
上边的两个例子功能完全一样,都是输出4个OK。按照传统{}用来写单行的Block,do...end用来写多行的Block,至于其他的什么规则实在懒得记,就遵循这一简单的传统吧。
NB的是,Ruby的Block还可以带参数,先举几个例子,至于为什么能这样等到专门的那一章的时候再说吧。
[4,5,6].each {|value| puts value} # 分别输出4,5,6
9、输入和输出
Ruby有很多的输入输出的方法,这里就简单介绍几个
puts上边已经介绍过了,它是用来输出puts的参数,然后加一个换行
print和puts一样只不过没有换行
printf和C中的printf类似
gets用来从终端读取输入,如果遇到EOF返回nil,所以它可以用在if和while中
while line = gets
puts line
end
10、命令行参数
当从命令行执行Ruby脚本的时侯
# ruby script.rb para1 para2 para3
ARGV(Array)包含所有的命令行参数
上个例子中则是["para1","para2","para3"]
ARGV.size代表命令行参数的个数,这个例子里是3
要注意的是,ARGV不包含ruby,script.rb,这和C语言是不一样的,C语言将程序本身作为第一个参数。
书上还有ARGF那段,没看懂。。。。