Ruby条件语句 #
一、条件语句概述 #
Ruby提供了多种条件语句来控制程序的执行流程。
| 语句 | 描述 |
|---|---|
| if | 如果条件为真执行 |
| unless | 如果条件为假执行 |
| case | 多条件分支 |
| ?: | 三元运算符 |
二、if语句 #
2.1 基本if #
ruby
score = 85
if score >= 60
puts "及格"
end
2.2 if-else #
ruby
score = 55
if score >= 60
puts "及格"
else
puts "不及格"
end
2.3 if-elsif-else #
ruby
score = 85
if score >= 90
puts "优秀"
elsif score >= 80
puts "良好"
elsif score >= 60
puts "及格"
else
puts "不及格"
end
2.4 修饰符形式 #
ruby
score = 85
puts "及格" if score >= 60
puts "不及格" unless score >= 60
2.5 返回值 #
ruby
score = 85
result = if score >= 60
"及格"
else
"不及格"
end
puts result
三、unless语句 #
3.1 基本unless #
ruby
logged_in = false
unless logged_in
puts "请先登录"
end
3.2 unless-else #
ruby
logged_in = false
unless logged_in
puts "请先登录"
else
puts "欢迎回来"
end
3.3 修饰符形式 #
ruby
logged_in = false
puts "请先登录" unless logged_in
3.4 unless vs if not #
ruby
unless condition
do_something
end
if !condition
do_something
end
四、case语句 #
4.1 基本case #
ruby
day = "Monday"
case day
when "Monday"
puts "星期一"
when "Tuesday"
puts "星期二"
when "Wednesday"
puts "星期三"
else
puts "其他"
end
4.2 多值匹配 #
ruby
day = "Saturday"
case day
when "Saturday", "Sunday"
puts "周末"
else
puts "工作日"
end
4.3 范围匹配 #
ruby
score = 85
case score
when 90..100
puts "A"
when 80...90
puts "B"
when 70...80
puts "C"
when 60...70
puts "D"
else
puts "F"
end
4.4 类型匹配 #
ruby
value = "hello"
case value
when String
puts "字符串"
when Integer
puts "整数"
when Array
puts "数组"
when Hash
puts "哈希"
else
puts "其他类型"
end
4.5 正则匹配 #
ruby
email = "user@example.com"
case email
when /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
puts "有效邮箱"
else
puts "无效邮箱"
end
4.6 使用then #
ruby
score = 85
case score
when 90..100 then puts "A"
when 80...90 then puts "B"
when 70...80 then puts "C"
else puts "F"
end
4.7 返回值 #
ruby
score = 85
grade = case score
when 90..100 then "A"
when 80...90 then "B"
when 70...80 then "C"
else "F"
end
puts grade
4.8 无条件case #
ruby
result = case
when score >= 90
"A"
when score >= 80
"B"
when score >= 60
"C"
else
"F"
end
五、三元运算符 #
5.1 基本用法 #
ruby
age = 20
status = age >= 18 ? "成年" : "未成年"
puts status
5.2 嵌套三元 #
ruby
score = 85
grade = score >= 90 ? "A" : score >= 80 ? "B" : score >= 60 ? "C" : "F"
puts grade
5.3 与if对比 #
ruby
age = 20
status = age >= 18 ? "成年" : "未成年"
status = if age >= 18
"成年"
else
"未成年"
end
5.4 方法调用 #
ruby
def even?(n)
n.even? ? "偶数" : "奇数"
end
puts even?(4)
puts even?(5)
六、条件表达式技巧 #
6.1 短路求值 #
ruby
user = nil
user && user.name
user&.name
user || create_guest
6.2 条件赋值 #
ruby
name = params[:name] || "Guest"
settings ||= {}
settings[:timeout] ||= 30
6.3 条件方法调用 #
ruby
def process(data)
return unless data
transform(data)
end
def save
valid? && persist && notify
end
七、实用示例 #
7.1 成绩等级 #
ruby
def grade(score)
case score
when 90..100 then "优秀"
when 80...90 then "良好"
when 70...80 then "中等"
when 60...70 then "及格"
else "不及格"
end
end
puts grade(95)
puts grade(85)
puts grade(55)
7.2 用户权限 #
ruby
def can_access?(user, resource)
case user.role
when "admin"
true
when "moderator"
resource.public? || resource.moderated_by?(user)
when "member"
resource.public? || resource.owned_by?(user)
else
false
end
end
7.3 类型处理 #
ruby
def process(value)
case value
when String
value.upcase
when Integer
value * 2
when Array
value.sum
when Hash
value.keys.sort
else
value.to_s
end
end
puts process("hello")
puts process(5)
puts process([1, 2, 3])
7.4 命令解析 #
ruby
def execute(command)
case command
when /^ls/
list_files
when /^cd\s+(.+)/
change_directory($1)
when /^mkdir\s+(.+)/
create_directory($1)
when /^rm\s+(.+)/
remove_file($1)
when "exit", "quit"
exit_program
else
puts "未知命令: #{command}"
end
end
7.5 状态机 #
ruby
class Order
STATES = %i[pending processing shipped delivered cancelled].freeze
def transition_to(new_state)
case [state, new_state]
when [:pending, :processing], [:processing, :shipped], [:shipped, :delivered]
@state = new_state
when [:pending, :cancelled], [:processing, :cancelled]
@state = new_state
else
raise "Invalid transition: #{state} -> #{new_state}"
end
end
end
八、最佳实践 #
8.1 选择合适的条件语句 #
ruby
if condition
do_something
end
puts "message" if condition
unless error
process
end
case value
when pattern1
action1
when pattern2
action2
end
8.2 避免深层嵌套 #
ruby
if user
if user.active?
if user.admin?
do_admin_stuff
end
end
end
return unless user
return unless user.active?
return unless user.admin?
do_admin_stuff
8.3 使用case替代复杂if-elsif #
ruby
if value == 1
action1
elsif value == 2
action2
elsif value == 3
action3
end
case value
when 1 then action1
when 2 then action2
when 3 then action3
end
8.4 三元运算符保持简洁 #
ruby
status = age >= 18 ? "成年" : "未成年"
grade = score >= 90 ? "A" :
score >= 80 ? "B" :
score >= 60 ? "C" : "F"
九、总结 #
本章我们学习了:
- if语句:基本if、if-else、if-elsif-else、修饰符形式
- unless语句:与if相反的逻辑
- case语句:多条件分支、范围匹配、类型匹配、正则匹配
- 三元运算符:简洁的条件表达式
- 条件技巧:短路求值、条件赋值
- 最佳实践:选择合适语句、避免嵌套
接下来让我们学习Ruby的循环语句!
最后更新:2026-03-27