Ruby 开发(二)- 基础语法(下)

220 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

五、流程控制

unless 语句

unless 是”如果....不能,除非....才..“的意思,在程序中unless的作用于 if 是相反的,如果条件为true,则执行else关键字后的代码块,如果条件为false,则执行then后面的代码块。

unless 条件 then
  条件为false时执行的代码块
else
  条件为true时执行的代码块
end
name = "thor"

unless name=="thor" then
  puts "不是 God of Thunder"
else
  puts "是 God of Thunder"
end

执行上述代码,输出结果为:

是 God of Thunder

case 语句

case 语句是将 case 关键字后的条件值一次与 when 后的常量进行比较,只要相等机会执行该 when 关键字后面的代码块。

case 表达式
when1,值2,值3 then
  代码块
when4, 值5, 值6 then
  代码块
else
  代码块
end

then 是可以省略的

day = "Sun"

case day
when "Mon"
  puts "今天是周一"
when "Sat", "Sun"
  puts "今天是周末"
else
  puts "今天是除了周末和周一以外的一天"
end

执行以上代码,输出结果如下:

今天是周末

when 关键字后面可以是一个 Range 对象,只有条件值在该 Range 范围内既可输出代码块中的内容

六、循环语句

在 Ruby 中,循环主要有三种,分别是 while 循环、until 循环和 for..in 循环。

while 语句

while 循环是指当指定的条件为 true 时,循环while关键字后的代码块。

while 条件 do
  代码块
end

while 关键字后的 do 可以省略,为了程序可读性不建议省略

# Ruby 中循环

i = 0

while i < 9 do
  puts "Mark " + i.to_s
  i = i + 1
end

执行上述代码,输出结果如下:

Mark 0
Mark 1
Mark 2
Mark 3
Mark 4
Mark 5
Mark 6
Mark 7
Mark 8

while 语句中一定要有循环退出的操作,否则会无限循环下去。

until 语句

until 语句与 while 语句的作用是相反的,当条件为 false 时,执行 until 语句中的代码块

until 条件 do
  条件为false时执行的代码块
end
i = 9

until i < 0 do
  puts "Mark " + i.to_s
  i = i - 1
end

执行上述代码,输出结果如下:

Mark 9
Mark 8
Mark 7
Mark 6
Mark 5
Mark 4
Mark 3
Mark 2
Mark 1
Mark 0

for ... in 语句

Ruby 中的 for...in 语句,主要作用于数组和 Hash 对象,主要是用作遍历数组和 Hash 对象中的元素。

for 元素变量名 in Array | Hash do
  代码块
end

for..in 遍历数组

for hero in ["thor", "stark", "clint"]
  puts hero
end

执行以上代码,输出结果如下:

thor
stark
clint

for..in 遍历 Hash 对象

# 遍历Hash
for k,v in {"name" => "stark", "age" => "30", "address" => "NY"} do
  puts "k=" + k + ",v=" + v
end

执行上述代码,输出结果如下:

k=name,v=stark
k=age,v=30
k=address,v=NY

loop

loop 关键字也可以实现循环,但是 loop 关键字没有条件,只能依赖跳出循环的关键字停止循环

loop {代码块}
loop do
代码块
end

迭代器

迭代器主要是用于将数组、Hash 对象和普通对象的变量进行迭代输出,可以对某个对象定义自己的迭代器,这样就可以无须使用 for...in 来完成循环了,起始迭代器只是用来遍历对象中的元素。

Array.each do |元素的名称|
  代码块
end
days = ["Mon", "Feb", "Wen"]
days.each do |day|
  puts day
end

执行上述代码,输出结果如下:

Mon
Feb
Wen

要注意自定义的变量名称需要|自定义变量名称|

七、跳出循环

在循环中有可能元素满足了某一条件就需要跳出本次循环而继续执行下一次循环或者直接结束循环等,Ruby 中也有 break、next、redo、return 等关键字来实现这些效果。

break 关键字

break 关键字在循环中可以跳出当前循环。

i = 0
loop do
  i = i + 1
  puts i
  if i > 5
    break
  end
end

执行上述代码,输出结果如下:

1
2
3
4
5
6

next 关键字

next 关键字只会结束当前循环,之后进入下一次循环,而 break 是结束整个循环。

i = 0
while i < 8
  if i == 5
    i = i + 1
    next
  end
  puts i
  i = i + 1
end

上述代码执行结果如下:

0
1
2
3
4
6
7

当 i = 5 时,没有输出。

redo 关键字

redo 关键字也可以实现跳出本次循环,继续下一次循环的功能,与 next 不同的是,redo不需要检查条件是否成立,可以直接执行下一次循环。

i = 0
while i < 8
  if i == 5
    i = i + 1
    redo
  end
  puts i
  i = i + 1
end

执行上述代码,输出结果如下:

0
1
2
3
4
6
7

在 next 或者 redo 关键字前要进行变量更新,否则容易造成死循环

return 关键字

return 关键字也可以用来结束循环语句,return 的主要作用是结束一个方法,并且针对这个方法有返回值。

def search(n)
  names = ["stark", "thor", "clint", "banner"]
  for name in names do
    puts name
    # puts n
    if name == n then
      return true
    else
      return false
    end
  end
end


if search("banner") then
  puts "banner 是第一个"
else
  puts "banner 不是第一个"
end

if search("stark") then
  puts "stark 是第一个"
else
  puts "stark 不是第一个"
end

执行上述代码,输出结果如下:

stark
banner 不是第一个
stark
stark 是第一个

search() 函数的入参是 “banner”,当循环到第一个元素时,if 表表达式返回false 循环结束。