Ruby的数组和hashs都是索引集合:数组用位置作为索引的key,hashs用对象作为索引的key.一个数组和hashs里可以存放不同类型的对象。
创建数组
创建空数组的方式有两种:
%w是创建字符串数组的快捷方式
创建hash
Ruby的数组没有越界异常,访问数组不包含的位置索引的值,得到nil,可以用负数作为索引。
默认情况下,hash里不存在的key索引的值为nil. 可以通过Hash的构造函数更改该默认行为:
Ruby的if和while语句,不使用{},使用end来表示结束。
如果if和while体里的语句很简单,只是一个单独的表达式,if和while可以简写为:
在Ruby里,正则表达式是一种数据类型。正则表达式常量的字面量格式为:/pattern/
“=~”是Ruby里定义的一种运算符,用于匹配字符串和正则表达式:如果字符串里能找到正则表达式,返回匹配的其实位置,否则返回nil.
代码块(Block)是Ruby的一个语法特色。Block用{}和do...end定义,可以被传递给方法调用,被调用的方法体里如果有yield语句,就会执行Block里的代码:
可以把被调用的方法和传递的Block看成两个例程,这两个例程之间通过yield传递控制
在yield语句里可以提供参数,这些参数会被传递给Block,Block用||的形式来接收传递的参数
Block在Ruby里主要用于迭代:
Ruby的I/O库:
puts: 把参数增加一个换行符后写到I/O对象里(默认为控制台)
print: 把参数写到I/O对象里(默认为控制台)
printf: 把参数格式化后写到I/O对象里(默认为控制台)
printf "Number: %5.2f, String: %s", 1.23, "hello"
gets: 从程序的标准输入流里读取一行字符串,并将其存到全局变量$_里
$_是个很特别的全局变量,在很多场景下,被用作默认的参数。例如print方法的默认参数就是$_,如果在使用if和while语句时只用正则表达式作为条件语句,等同于$_ =~ /pattern/
上诉代码另一种简单的写法是:
创建数组
a = [ 1, 'cat', 3.14 ] # array with three elements
# access the first element
a[0] » 1
# set the third element
a[2] = nil
# dump out the array
a » [1, "cat", nil]
创建空数组的方式有两种:
empty1 = []
empty2 = Array.new
%w是创建字符串数组的快捷方式
a = %w{ ant bee cat dog elk }
a[0] » "ant"
a[3] » "dog"
创建hash
instSection = {
'cello' => 'string',
'clarinet' => 'woodwind',
'drum' => 'percussion',
'oboe' => 'woodwind',
'trumpet' => 'brass',
'violin' => 'string'
}
instSection['oboe'] » "woodwind"
instSection['cello'] » "string"
instSection['bassoon'] » nil
Ruby的数组没有越界异常,访问数组不包含的位置索引的值,得到nil,可以用负数作为索引。
默认情况下,hash里不存在的key索引的值为nil. 可以通过Hash的构造函数更改该默认行为:
histogram = Hash.new(0)
histogram['key1'] » 0
histogram['key1'] = histogram['key1'] + 1
histogram['key1']
Ruby的if和while语句,不使用{},使用end来表示结束。
if count > 10
puts "Try again"
elsif tries == 3
puts "You lose"
else
puts "Enter a number"
end
while weight < 100 and numPallets <= 30
pallet = nextPallet()
weight += pallet.weight
numPallets += 1
end
如果if和while体里的语句很简单,只是一个单独的表达式,if和while可以简写为:
puts "Danger, Will Robinson" if radiation > 3000
square = square*square while square < 1000
在Ruby里,正则表达式是一种数据类型。正则表达式常量的字面量格式为:/pattern/
“=~”是Ruby里定义的一种运算符,用于匹配字符串和正则表达式:如果字符串里能找到正则表达式,返回匹配的其实位置,否则返回nil.
if line =~ /Perl|Python/
puts "Scripting language mentioned: #{line}"
end
代码块(Block)是Ruby的一个语法特色。Block用{}和do...end定义,可以被传递给方法调用,被调用的方法体里如果有yield语句,就会执行Block里的代码:
def callBlock
yield
yield
end
callBlock { puts "In the block" }
//produces:
In the block
In the block
可以把被调用的方法和传递的Block看成两个例程,这两个例程之间通过yield传递控制
在yield语句里可以提供参数,这些参数会被传递给Block,Block用||的形式来接收传递的参数
Block在Ruby里主要用于迭代:
a = %w( ant bee cat dog elk ) # create an array
a.each { |animal| puts animal } # iterate over the contents
[ 'cat', 'dog', 'horse' ].each do |animal|
print animal, " -- "
end
5.times { print "*" }
3.upto(6) {|i| print i }
('a'..'e').each {|char| print char }
Ruby的I/O库:
puts: 把参数增加一个换行符后写到I/O对象里(默认为控制台)
print: 把参数写到I/O对象里(默认为控制台)
printf: 把参数格式化后写到I/O对象里(默认为控制台)
printf "Number: %5.2f, String: %s", 1.23, "hello"
gets: 从程序的标准输入流里读取一行字符串,并将其存到全局变量$_里
$_是个很特别的全局变量,在很多场景下,被用作默认的参数。例如print方法的默认参数就是$_,如果在使用if和while语句时只用正则表达式作为条件语句,等同于$_ =~ /pattern/
while gets # assigns line to $_
if /Ruby/ # matches against $_
print # prints $_
end
end
上诉代码另一种简单的写法是:
ARGF.each { |line| print line if line =~ /Ruby/ }
ARGF是一个预定义的对象,表示能被程序读取的输入流。