Ruby布尔值 #

一、布尔类型概述 #

Ruby中的布尔类型包括 truefalse,它们分别是 TrueClassFalseClass 的唯一实例。

ruby
true.class
false.class
true.class.superclass
false.class.superclass

二、true和false #

2.1 true #

true 表示逻辑真值:

ruby
result = true
puts result
puts result.class
puts result.nil?
puts result.to_s

2.2 false #

false 表示逻辑假值:

ruby
result = false
puts result
puts result.class
puts result.nil?
puts result.to_s

2.3 布尔运算 #

ruby
true && true
true && false
true || false
false || false
!true
!false

三、真假值规则 #

3.1 Ruby的真假值规则 #

在Ruby中,只有 falsenil 为假,其他所有值都为真。

布尔值
false
nil
true
0
""
[]
{}

3.2 与其他语言的区别 #

ruby
if 0
  puts "0是真"
end

if ""
  puts "空字符串是真"
end

if []
  puts "空数组是真"
end

if nil
  puts "不会执行"
else
  puts "nil是假"
end

3.3 常见陷阱 #

ruby
def find_user(id)
  nil
end

user = find_user(1)
if user
  puts "找到用户"
else
  puts "用户不存在"
end

def get_status
  false
end

status = get_status
if status == false
  puts "状态是false"
elsif status.nil?
  puts "状态是nil"
end

四、条件表达式 #

4.1 if语句 #

ruby
score = 85

if score >= 90
  puts "优秀"
elsif score >= 80
  puts "良好"
elsif score >= 60
  puts "及格"
else
  puts "不及格"
end

4.2 unless语句 #

ruby
logged_in = false

unless logged_in
  puts "请先登录"
end

puts "请先登录" unless logged_in

4.3 三元运算符 #

ruby
age = 20
status = age >= 18 ? "成年" : "未成年"
puts status

result = condition ? "真值" : "假值"

4.4 修饰符形式 #

ruby
admin = true

puts "欢迎管理员" if admin
puts "请登录" unless logged_in

五、逻辑运算符 #

5.1 与运算(&&) #

ruby
a = true
b = true
c = false

a && b
a && c
a && b && c

5.2 或运算(||) #

ruby
a = true
b = false

a || b
b || b
a || a

5.3 非运算(!) #

ruby
!true
!false
!!true
!!0
!!nil

5.4 短路求值 #

ruby
def expensive_operation
  puts "执行耗时操作"
  true
end

false && expensive_operation
true || expensive_operation

true && expensive_operation
false || expensive_operation

5.5 and/or vs &&/|| #

ruby
# && 和 || 优先级高
a = true && false
a = true and false

# 推荐使用 && 和 || 进行布尔运算
# and 和 or 用于流程控制

result = operation or raise "操作失败"
success = a && b && c

六、布尔方法 #

6.1 谓词方法 #

? 结尾的方法通常返回布尔值:

ruby
1.even?
2.odd?
"hello".empty?
[].empty?
nil.nil?
"hello".start_with?("h")
"hello".end_with?("o")
[1, 2, 3].include?(2)
{a: 1}.key?(:a)

6.2 自定义谓词方法 #

ruby
class User
  def initialize(role)
    @role = role
  end

  def admin?
    @role == "admin"
  end

  def active?
    @role != "banned"
  end
end

user = User.new("admin")
puts user.admin?
puts user.active?

6.3 双重否定 #

ruby
def truthy?(value)
  !!value
end

truthy?(1)
truthy?("")
truthy?(nil)
truthy?(false)

七、nil与布尔 #

7.1 nil的特点 #

ruby
nil.class
nil.nil?
nil.to_s
nil.to_a
nil.to_i
nil.to_f
nil == nil
nil.eql?(nil)
nil.equal?(nil)

7.2 nil检查 #

ruby
value = nil

if value.nil?
  puts "值是nil"
end

if value
  puts "值不是nil或false"
else
  puts "值是nil或false"
end

7.3 安全导航操作符 #

ruby
user = nil

user&.name
user&.profile&.avatar

user&.name || "Guest"

八、比较运算符 #

8.1 相等比较 #

ruby
1 == 1
1 == 2
"hello" == "hello"
nil == nil
true == true
false == false

8.2 不等比较 #

ruby
1 != 2
"hello" != "world"
true != false
nil != false

8.3 大小比较 #

ruby
1 < 2
1 > 2
1 <= 1
1 >= 1
"a" < "b"

8.4 太空船运算符 #

ruby
1 <=> 2
2 <=> 1
1 <=> 1

["apple", "banana"].sort
[3, 1, 2].sort

8.5 case相等 #

ruby
(1..10) === 5
String === "hello"
Integer === 42
/ Ruby/ === "Hello Ruby"

九、实用模式 #

9.1 默认值 #

ruby
name = nil
name = name || "Guest"
name ||= "Guest"

name = params[:name] || "Guest"
name = params[:name] || params[:nickname] || "Guest"

9.2 条件赋值 #

ruby
user = find_user(id) || create_guest_user

result = if condition
           do_something
         else
           do_other_thing
         end

9.3 存在性检查 #

ruby
def process(data)
  return unless data

  puts "处理数据: #{data}"
end

def greet(name = nil)
  name ||= "Guest"
  puts "Hello, #{name}"
end

9.4 布尔转换方法 #

ruby
class Object
  def to_bool
    !!self
  end
end

nil.to_bool
false.to_bool
0.to_bool
"".to_bool
"hello".to_bool

十、ActiveSupport扩展 #

Rails的ActiveSupport提供了额外的布尔方法:

10.1 present?和blank? #

ruby
require 'active_support/core_ext/object/blank'

nil.blank?
"".blank?
"  ".blank?
[].blank?
{}.blank?
false.blank?

"hello".present?
[1, 2, 3].present?

10.2 presence #

ruby
name = ""
name.presence || "Guest"

params = { nickname: "Ruby" }
username = params[:name].presence || params[:nickname].presence || "Guest"

10.3 try #

ruby
user = nil
user.try(:name)
user.try(:profile).try(:avatar)

user&.name

十一、最佳实践 #

11.1 明确布尔返回 #

ruby
def admin?
  @role == "admin"
end

def has_permission?
  !!@permission
end

11.2 避免冗余比较 #

ruby
if user.admin? == true
end

if user.admin?
end

if !user.admin?.!
end

11.3 使用语义化命名 #

ruby
def user_can_edit?
  logged_in? && (admin? || owner?)
end

def should_notify?
  active? && subscribed?
end

十二、总结 #

本章我们学习了:

  1. 布尔类型:true和false是TrueClass和FalseClass的实例
  2. 真假值规则:只有false和nil为假,其他都为真
  3. 逻辑运算符:&&、||、!以及短路求值
  4. 谓词方法:以?结尾的方法通常返回布尔值
  5. nil处理:nil检查、安全导航操作符
  6. 实用模式:默认值、条件赋值、存在性检查

接下来让我们学习Ruby的符号类型!

最后更新:2026-03-27