ZetCode

Ruby 的 and 关键字

最后修改日期:2025 年 4 月 27 日

本教程解释了如何使用 Ruby 的 and 关键字。在 Ruby 程序中,它既可用作逻辑运算符,也可用作控制流工具。

and 关键字会评估多个表达式,返回第一个假值或最后一个真值。它的优先级低于 &&

&& 不同,and 更适用于控制流而非布尔逻辑。它通常用于链接操作,其中任何失败都会停止执行。

基本的 and 运算符

此示例显示了 and 的基本布尔运算。只有当两个操作数都为真时,它才返回 true

basic_and.rb
result = true and false
puts result  # => false

result = 1 and "hello"
puts result  # => "hello"

result = nil and 5
puts result.inspect  # => nil

and 运算符从左到右评估表达式。如果所有值都为真,它将返回第一个假值或最后一个值。

and 与 && 的优先级

and&& 之间的关键区别在于优先级。and 的优先级低得多,这会影响评估顺序。

precedence.rb
x = true && false
puts x  # => false

y = true and false
puts y  # => true

第一个示例将 && 的结果赋给 x。第二个示例将 true 赋给 y,然后评估 and false。这演示了 and 的低优先级。

使用 and 进行控制流

and 通常用于控制流,其中操作仅在前一个操作成功时继续。此示例显示了一个常见模式。

control_flow.rb
def fetch_data
  # Simulate possible failure
  rand > 0.5 ? "data" : nil
end

data = fetch_data and process_data(data)

puts "Data processed successfully" if data

def process_data(data)
  puts "Processing: #{data}"
end

仅当 fetch_data 返回真值时,process_data 方法才会运行。这提供了简洁的条件执行。

使用 and 进行多条件判断

and 可以将多个条件链接在一起。由于短路行为,评估将在第一个假值处停止。

multiple_conditions.rb
def valid_user?(user)
  user[:name] and user[:email] and user[:active]
end

user1 = { name: "John", email: "john@example.com", active: true }
user2 = { name: "Alice", email: nil, active: true }

puts valid_user?(user1)  # => true
puts valid_user?(user2)  # => false

该方法检查所有必需的用户属性。如果任何检查失败,它会立即返回 false,从而提高了效率。

and 用于赋值保护

and 可以在条件失败时防止赋值。此模式有助于避免用 nil 值覆盖变量。

assignment_guard.rb
def get_config_value
  # Simulate config lookup that might fail
  rand > 0.3 ? "admin" : nil
end

# Only assign if get_config_value returns truthy
role = get_config_value and role = role.upcase

puts role.inspect

仅当 get_config_value 返回真值时,变量 role 才会赋值和修改。这可以防止 nil 错误。

and 在修饰符位置

and 可用于语句修饰符位置以有条件地执行代码。这提供了 if 的简洁替代方案。

modifier_position.rb
def log_in(user)
  puts "Logging in #{user[:name]}"
  user[:authenticated] = true
end

current_user = { name: "John", password: "secret" }

authenticate(current_user) and log_in(current_user)

def authenticate(user)
  user[:password] == "secret"
end

仅当 authenticate 返回 true 时,log_in 方法才会执行。这种模式在身份验证流程中很常见。

使用 and 进行错误处理

and 可以将操作与错误处理链接起来。每个步骤仅在前一个步骤成功时执行。

error_handling.rb
def read_file(path)
  File.exist?(path) and File.read(path)
end

def parse_json(data)
  JSON.parse(data) rescue nil
end

data = read_file("config.json") and config = parse_json(data)

puts config ? "Config loaded" : "Failed to load config"

该示例安全地尝试读取和解析文件。每个操作仅在前一个操作成功时继续,从而避免了嵌套的条件语句。

来源

Ruby 关键字文档

本教程涵盖了 Ruby 的 and 关键字,并通过实际示例展示了布尔逻辑、控制流和错误处理模式。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Ruby 教程