Ruby布尔值 #
一、布尔类型概述 #
Ruby中的布尔类型包括 true 和 false,它们分别是 TrueClass 和 FalseClass 的唯一实例。
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中,只有 false 和 nil 为假,其他所有值都为真。
| 值 | 布尔值 |
|---|---|
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
十二、总结 #
本章我们学习了:
- 布尔类型:true和false是TrueClass和FalseClass的实例
- 真假值规则:只有false和nil为假,其他都为真
- 逻辑运算符:&&、||、!以及短路求值
- 谓词方法:以?结尾的方法通常返回布尔值
- nil处理:nil检查、安全导航操作符
- 实用模式:默认值、条件赋值、存在性检查
接下来让我们学习Ruby的符号类型!
最后更新:2026-03-27