4-ruby case语句和循环中的while语句以及until语句
本篇章的主要内容
- case语句
- while循环以及until语句
case语句
在 Ruby 中,case 语句是一种多条件分支结构,类似于其他语言的 switch-case,但更灵活强大。它使用 case-when-else 语法,可以匹配值、范围、类型、正则表达式等。
- case语句的语法:case 变量;当变量的值与case后的值匹配时,执行相应的代码块。
- case语句的结构:类似于其他语言中的switch语句,但ruby中没有switch关键字。
- case语句的特点:可以添加多个case,每个case后面跟着一个条件判断。
- 与传统switch语句的区别:ruby中的case语句没有break关键字,只会执行当前条件的代码块。
- 条件的复杂性:ruby中的case语句的条件可以是复杂的判断式。
- 范围表达式的使用:可以使用范围表达式来描述值的范围。
基础语法
case 表达式
when 值1
# 匹配值1时执行
when 值2
# 匹配值2时执行
else
# 其他情况执行(可选)
end
示例:
基本用法(匹配值)
# 基本用法(匹配值)
grade = 'B'
case grade
when 'A'
puts '优秀'
when 'B'
puts '良好'
when 'C'
puts '及格'
else
puts '不及格'
end
# 输出: 良好
使用范围匹配
score = 85
case score
when 90..100
puts 'A'
when 80..89
puts 'B'
when 70..79
puts 'C'
else
puts 'F'
end
# 输出: B
使用正则表达式匹配
input = "hello123"
case input
when /^[a-z]+$/
puts "全是字母"
when /^\d+$/
puts "全是数字"
when /^[a-z]+\d+$/
puts "字母开头后跟数字"
else
puts "其他模式"
end
# 输出: 字母开头后跟数字
省略表达式(当作 if-elsif 使用)
age = 25
case
when age < 18
puts "未成年"
when age >= 18 && age < 65
puts "成年人"
else
puts "老年人"
end
# 输出: 成年人
多条件匹配
fruit = "apple"
case fruit
when "apple", "pear", "banana"
puts "这是常见水果"
when "dragonfruit", "kiwi"
puts "这是进口水果"
else
puts "未知水果"
end
# 输出: 这是常见水果
使用 Proc 或 lambda 匹配
even_check = ->(x) { x.even? }
odd_check = ->(x) { x.odd? }
number = 7
case number
when even_check
puts "偶数"
when odd_check
puts "奇数"
end
# 输出: 奇数
返回值
case 语句会返回最后执行的表达式的值:
result = case 2
when 1 then "one"
when 2 then "two"
else "many"
end
puts result # 输出: two
这使得 case 语句可以用于赋值或作为方法的返回值。
注意事项
- Ruby 的 case 语句使用 === 运算符进行比较,这使得它可以处理多种匹配方式
- when 子句是按顺序评估的,第一个匹配的 when 块会被执行
- else 子句是可选的,用于处理没有匹配的情况
- 不需要使用 break 语句(与某些语言不同),Ruby 的 case 语句会自动跳出
循环语句的基本概念
- 循环语句的作用:重复执行一段代码,直到满足特定条件。
- while循环:当给定的条件满足时,执行代码块。
- until循环:当给定的条件不满足时,执行代码块。
- break和continue关键字:用于在循环中跳出或跳过某些迭代。
while循环
基本语法
while 条件
# 循环体代码
end
代码示例
# 计数循环
count = 0
while count < 5
puts "Count: #{count}"
count += 1
end
# 输出:
# Count: 0
# Count: 1
# Count: 2
# Count: 3
# Count: 4
until循环
until 是 while 的反向操作,当条件为假时执行循环
基本语法
until 条件
# 循环体代码
end
代码示例
# 倒计时
timer = 3
until timer == 0
puts "倒计时: #{timer}"
timer -= 1
end
puts "时间到!"
# 输出:
# 倒计时: 3
# 倒计时: 2
# 倒计时: 1
# 时间到!
break 关键字
用于提前退出循环
基本语法
while 条件
# 代码
break if 退出条件
# 更多代码
end
代码示例
# 查找第一个能被7整除的数
num = 1
while true
if num % 7 == 0
puts "找到第一个能被7整除的数: #{num}"
break
end
num += 1
end
# 输出: 找到第一个能被7整除的数: 7
next 关键字
跳过当前迭代,继续下一次循环
基本语法
while 条件
# 代码
next if 跳过条件
# 更多代码
end
代码示例
# 打印1-10的奇数
n = 0
while n < 10
n += 1
next if n % 2 == 0
puts "奇数: #{n}"
end
# 输出:
# 奇数: 1
# 奇数: 3
# 奇数: 5
# 奇数: 7
# 奇数: 9
综合示例
编写密码验证系统:
# 密码验证系统,最多尝试3次
attempts = 0
correct_password = "ruby123"
while attempts < 3
print "请输入密码(还剩#{3 - attempts}次机会): "
input = gets.chomp
if input != correct_password
attempts += 1
next if attempts < 3 # 跳过后续代码,继续循环
puts "密码错误,账户已锁定!"
break
end
puts "登录成功!"
break
end
# 可能的输出:
# 请输入密码(还剩3次机会): wrong
# 请输入密码(还剩2次机会): wrong
# 请输入密码(还剩1次机会): ruby123
# 登录成功!
特殊形式
单行形式
count = 0
puts(count += 1) while count < 5 # 输出1到5
后置循环(至少执行一次)
x = 10
begin
puts "x = #{x}"
x += 1
end while x < 5 # 虽然条件不满足,但会先执行一次
# 输出: x = 10
注意事项
- while 和 until 都可以与 begin...end 结合使用,确保循环体至少执行一次
- break 可以带返回值,如 break "result"
- next 也可以带参数,影响循环变量的值
- 避免无限循环,确保循环条件最终会变为 false
- Ruby 中更推荐使用迭代器 (each, times 等) 来处理大多数循环场景