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"

九、总结 #

本章我们学习了:

  1. if语句:基本if、if-else、if-elsif-else、修饰符形式
  2. unless语句:与if相反的逻辑
  3. case语句:多条件分支、范围匹配、类型匹配、正则匹配
  4. 三元运算符:简洁的条件表达式
  5. 条件技巧:短路求值、条件赋值
  6. 最佳实践:选择合适语句、避免嵌套

接下来让我们学习Ruby的循环语句!

最后更新:2026-03-27