1.1.1ruby命令的执行方法
print("Hello")
p方法
无论是print方法还是puts方法,输出数值1和字符串"1"时,结果都是单纯的1,这样,我们有时候会无法判断结果到底属于哪个对象,p方法解决了这个问题,数值结果和字符串结果会以不同的形式输出。
print "100"
print 100
puts "100"
puts 100
p "100"
p 100
100100100
100
"100"
100
像这样,输出结果为字符串时,输出结果会被双引号括起来,一目了然。另外,使用 p 方法时,换行符(\n)、制表符(\t)等特殊字符不会转义,会像下 面那样直接输出。
1.12条件判断
if 条件 then
条件成立时执行的语句
else
条件不成立时执行的语句
end
注意:then是可以省略的。
1.13循环
1.13.1while语句
while 循环条件 do
循环语句
end
1.13.2times方法
循环次数.times do
循环语句
end
2方便的对象
像数组、散列这样保存对象的对象,我们称为容器(container)。
2.1数组
2.1.1数组的创建
names = ["a", "b", "c"]
在保存对象时,如果指定了数组中不存在的索引值时,则数组的大小会随之改变。即Ruby数组的大小是按实际情况自动调整的。
示例
2.5.3 :001 > names = ["zhao", "qian", "sun", "li"]
=> ["zhao", "qian", "sun", "li"]
2.5.3 :002 > names[4] = "wang"
=> "wang"
2.5.3 :003 > names
=> ["zhao", "qian", "sun", "li", "wang"]
2.5.3 :004 >
2.1.5数组的元素
任何对象都可以作为数组元素保存到数组中。
Ruby数组还支持多种不同对象的混合保存。
2.5.3 :004 > mixed = [1, "wang",3,"李"]
=> [1, "wang", 3, "李"]
2.5.3 :005 > mixed.class
=> Array
像时间,文件等对象也都可以作为数组的元素。
2.1.6数组的大小
array.size
2.1.7数组的循环
Ruby提供了each方法。
语法如下:
数组 .each do |变量|
循环语句
end
each后面do~end之间的部分叫做块(block)。
2.2散列
散列(hash)也是一个程序里常用到的容器。散列是键值对(key-value pair)的一种数据结构。在 Ruby 中,一般是以字符串或者符号(Symbol)作为 键,来保存对应的对象。
2.2.1什么是符号
符号(symbol)是一种对象,一般作为名称标签来使用,用来表示方法等对象的名称,可以将符号简单理解为轻量级的字符串。
创建符号,只需要在标识符的开头加上:就可以了。
以下两种方式实现功能相同。
sym = :foo
=> :foo
sym.class
=> Symbol
sym2 = :"foo"
=> :foo
sym2.class
=> Symbol
符号能实现的功能,大部分字符串也能实现,那为什么还要使用符号呢?
像散列键这样只是单纯判断“是否相等”的处理中,使用符号会比字符串更加有效率,因此在实际编程中我们也会经常用到符号。
符号和字符串可以任意转换,对符号使用to_s方法可以得到字符串。
对字符串使用to_sym方法,则可以得到对应的符号。
2.5.3 :001 > sym = :foo
=> :foo
2.5.3 :002 > sym.to_s
=> "foo"
2.5.3 :003 > "foo".to_sym
=> :foo
2.2.2散列的创建
使用{}把创建的内容括起来,用=>来定义获取对象时所需的(key),以及键相对应的对象(value)。
address = {:name => "高桥", :pinyin => "gaoqiao", :postal => "1234567"}
将符号当作键来使用时,程序还可以像下面这么写:
address = {name: "高桥", pinyin: "gaoqiao", postal: "1234567"}
2.2.3散列的使用
散列名 [键]
示例
2.5.3 :001 > address = {name: "高桥", pinyin: "gaoqiao"}
=> {:name=>"高桥", :pinyin=>"gaoqiao"}
2.5.3 :002 > address[:name]
=> "高桥"
2.5.3 :003 > address[:pinyin]
=> "gaoqiao"
2.5.3 :004 > address[:tel] = "000-1234"
=> "000-1234"
2.5.3 :005 > address
=> {:name=>"高桥", :pinyin=>"gaoqiao", :tel=>"000-1234"}
2.5.3 :006 > address.class
=> Hash
2.5.3 :007 >
address = {name: "高桥", pinyin: "gaoqiao", tel: 1234-000}
address[:tel].class
=> Integer
2.2.4散列的循环
语法如下:
散列 .each do |键变量, 值变量|
循环语句
end
示例如下:
2.5.3 :001 > address = {name: "高桥", pinyin: "gaoqiao", tel: 1234}
=> {:name=>"高桥", :pinyin=>"gaoqiao", :tel=>1234}
2.5.3 :002 > address.each do |key, value|
2.5.3 :003 > puts "#{key}: #{value}"
2.5.3 :004?> end
name: 高桥
pinyin: gaoqiao
tel: 1234
=> {:name=>"高桥", :pinyin=>"gaoqiao", :tel=>1234}
2.3正则表达式
在Ruby中处理字符串时,我们经常会用到正则表达式(regular expression)。可以非常简单的实现以下功能:
·将字符串与模式(pattern)相匹配
·使用模式分割字符串
某些使用场景:
1.找出包含xx字符串的行。
2.抽取oo和xx之间的字符串。
判断字符串是否适用于某模式的过程成为匹配,如果字符串适用于该模式则成为匹配成功。
匹配的例子
创建正则表达式的语法如下所示:
/模式/
例如,我们希望匹配Ruby字符串的正则表达式为:
/Ruby/
把希望匹配的内容直接写出来,就这么简单。匹配字母、数字、汉字时,模式按字符串原样写就可以了。
我们使用=~来匹配正则表达式和字符串,它与判断是否是同一个对象时所用到的==有点像。
匹配正则表达式与字符串的方法是:
/模式/=~希望匹配的字符串
若匹配成功,返回匹配部分的位置。
若匹配失败,返回nil。
示例如下:
2.5.3 :005 > /Ruby/ =~ "Rubyyyy"
=> 0
2.5.3 :006 > /Ruby/ =~ "rubyyy"
=> nil
2.5.3 :007 > /Ruby/i =~ "rubyyy"
=> 0
正则表达式右边的/后面加上i表示不区分大小写进行匹配。
除此之外,正则表达式还要很多写法和用法,将在16章介绍。