1.1 条件判断
1.1.1 if条件语句
(1) 多行使用if..end; if..else..end; if..elsif..else..end;
print "输入分数:"
score = gets.to_i
if score >= 90
puts "得A"
elsif score >= 80 and score < 90
puts "得B"
elsif score >= 70 and score < 80
puts "得C"
elsif score >= 60 and score < 70
puts "得D"
else
puts "不及格"
end
(2) 单行使用if..then..end; if..;..;end
if ARGV[0] then filename = ARGV[0] end
等效于 filename = ARGV[0] if ARGV[0]
1.1.2 unless条件语句
unless和if刚好相反,if条件成立才会执行区块内容,unless则在条件不成立才会执行区块,if是如果条件成立就执行区块,unless是除非条件成立,否则就执行区块。unless也可以搭配else使用。
print "输入正数:"
number = gets.to_i
unless number >= 0
number = -number
end
puts number
1.1.3 case..when..条件语句
when多行显示:
print "请输入分数:"
case gets.to_i / 10
when 10, 9
puts "等级A"
when 8
puts "等级B"
when 7
puts "等级C"
when 6
puts "等级D"
else
puts "等级E"
end
when单行显示:
print "请输入分数:"
case gets.to_i / 10
when 10, 9 then puts "等级A"
when 8 then puts "等级B"
when 7 then puts "等级C"
when 6 then puts "等级D "
else puts "等级E"
end
1.2 循环
1.2.1 while语句
(1) 前while循环
puts "输入两个数字..."
m = gets.to_i
n = gets.to_i
while n != 0
r = m % n
m = n
n = r
end
puts "GCD: #{m}"
(2) 后while循环
begin
print "输入数字:"
printf "输入数为%s\n", gets.to_i % 2 == 0 ? "偶数" : "奇数"
print "继续?(Yes/No)"
end while gets.chomp.upcase== "YES"
(3) while单行用法
n = 1
n = (rand() * 10).to_i while n % 2 == 1
puts n
1.2.2 until语句
与while相反的是until,while是条件式成立时,执行循环体,until是直到条件式成立前,都要执行循环体。
(1) 前until循环
puts "输入两个数字..."
m = gets.to_i
n = gets.to_i
until n == 0
r = m % n
m = n
n = r
end
puts "GCD: #{m}"
(2) 后until循环
begin
print "输入数字:"
printf "输入数为%s\n", gets.to_i % 2 == 0 ? "偶数" : "奇数"
print "继续?(Yes/No)"
end until gets.chomp.upcase == "NO"
(3) until单行用法
n = 1
n = (rand() * 10).to_i until n % 2 != 1
print n
1.2.3 loop语句
loop {puts "loop until the end of the world"}
loop do
print "输入数字:"
number = gets.to_i
printf "输入数为%s\n" % (number % 2 == 0 ? "偶数" : "奇数")
print "继续?(Yes /No)"
if gets.chomp == "No"
break
end
end
1.2.4 for语句
for i in 1..3
puts i
end
for i in [2,3]
puts i
end
1.2.5 times遍历
times通常用在指定次数的循环上。
10.times {|i| puts "第#{i + 1}次的Orz..." }
10.times do |i|
puts "第#{i + 1}次的Orz..."
end
1.2.6 each遍历
each是迭代器,loop、 times方法也是迭代器,只要可以使用each方法,就可以使用for,for其实是利用了each方法的语法。
[1, 2, 3, 4, 5].each{|x| print x}
[1, 2, 3, 4, 5].each do |element|
print element
end
1.2.7 循环中的控制(next、break、redo)
break用于跳出整个循环;next用于跳出本次执行区间;redo用于重做当前执行区间。
#底下显示1234
for i in 1..9
if i == 5
break
end
print i
end
puts
#底下显示12346789
for i in 1..9
if i == 5
next
end
print i
end
#底下显示1234redoredoredo....
for i in 1..9
if i == 5
print "redo"
redo
end
print i
end
1.2.8 异常语句begin...rescue...ensure
begin...rescue...ensure类似try...catch...finally。
例1:
print "文件案名称:"
name = gets.chomp
file = open(name, "r")
begin
file.each do |line|
print line
end
rescue
print "读取档案发生错误"
ensure
file.close
end
例2:
def odd_even?
begin
print "输入整数:"
input = Integer(gets)
puts "#{input}为%s" % (input % 2 == 0 ? "偶数" : "奇数")
rescue ArgumentError => e
puts "请输入阿拉伯数字"
print e.backtrace
end
end
odd_even?