9-ruby 运算符的详解

9-ruby 运算符的详解

1. 算术运算符

ruby 复制代码
# 算术运算符
a, b = 10, 3

puts a + b   # 加法 13
puts a - b   # 减法 7
puts a * b   # 乘法 30
puts a / b   # 除法 3 (整数除法)
puts a % b   # 取模 1
puts a ** b  # 幂运算 1000
puts -a      # 取负 -10

2. 比较运算符

ruby 复制代码
# 比较运算符
x, y = 5, 5.0

puts x == y   # 等于 true (值相等)
puts x.eql?(y) # 严格等于 false (类型不同)
puts x != y   # 不等于 false
puts x > y    # 大于 false
puts x < y    # 小于 false
puts x >= y   # 大于等于 true
puts x <= y   # 小于等于 true
puts x <=> y  # 太空船运算符 0 (相等返回0)

3. 逻辑运算符

ruby 复制代码
# 逻辑运算符
t, f = true, false

puts t && f   # 逻辑与 false
puts t || f   # 逻辑或 true
puts !t       # 逻辑非 false
puts t and f  # 低优先级与 false
puts t or f   # 低优先级或 true
puts not(t)   # 低优先级非 false
puts t ^ f    # 逻辑异或 true

4. 赋值运算符

ruby 复制代码
# 赋值运算符
a = 10
a += 5    # a = a + 5 → 15
a -= 3    # a = a - 3 → 12
a *= 2    # a = a * 2 → 24
a /= 4    # a = a / 4 → 6
a %= 5    # a = a % 5 → 1
a **= 3   # a = a ** 3 → 1

# 并行赋值
x, y, z = 1, 2, 3
x, y = y, x  # 交换值
puts x, y, z  # 输出: 2 1 3

5. 位运算符

ruby 复制代码
# 位运算符
a, b = 60, 13  # 二进制: 00111100, 00001101

puts a & b   # 按位与 12 (00001100)
puts a | b   # 按位或 61 (00111101)
puts a ^ b   # 按位异或 49 (00110001)
puts ~a      # 按位取补 -61 (11000011)
puts a << 2  # 左移 240 (11110000)
puts a >> 2  # 右移 15 (00001111)

6. 三元运算符

ruby 复制代码
# 三元运算符
age = 20
status = age >= 18 ? "成人" : "未成年"
puts status  # 输出: 成人

7. 范围运算符

ruby 复制代码
# 范围运算符

# 包含范围 (1..5)
(1..5).each { |n| print n }  # 输出: 12345

# 不包含范围 (1...5)
(1...5).each { |n| print n }  # 输出: 1234

# 检查包含
puts (1..10) === 5  # true
puts ('a'..'z') === 'm'  # true

8. 特殊运算符

defined? 运算符

ruby 复制代码
# defined? 运算符
var = 10
puts defined?(var)  # "local-variable"
puts defined?(nonexistent)  # nil

安全导航运算符 &. (Ruby 2.3+)

ruby 复制代码
# 安全导航运算符 &. (Ruby 2.3+)
user = nil
puts user&.name  # 输出nil而不报错

user = OpenStruct.new(name: "Alice")
puts user&.name  # 输出Alice

匹配运算符 =~

ruby 复制代码
# 匹配运算符 =~
puts "hello" =~ /ll/  # 返回匹配位置 2
puts /ll/ =~ "hello"  # 同样返回 2
puts "hello" =~ /xx/  # 不匹配返回nil

!~ 运算符

ruby 复制代码
# !~ 运算符
puts "hello" !~ /ll/  # false
puts "hello" !~ /xx/  # true

9. 运算符优先级

从高到低的部分优先级:

  1. :: 常量解析
  2. [] []= 数组索引
  3. ** 指数
  4. ! ~ + - 非/补/正/负
  5. * / % 乘/除/模
  6. + - 加/减
  7. << >> 位移
  8. & 位与
  9. | ^ 位或/异或
  10. > >= < <= 比较
  11. <=> == === != =~ !~ 相等/匹配
  12. && 逻辑与
  13. || 逻辑或
  14. .. ... 范围
  15. ? : 三元
  16. = += -= 等赋值
  17. not 低优先级非
  18. and or 低优先级与/或

10. 运算符重载示例

ruby 复制代码
# 运算符重载示例

# 定义一个向量类
class Vector
  # 定义属性访问器
  attr_accessor :x, :y

  # 初始化方法
  def initialize(x, y)
    @x = x
    @y = y
  end

  # 定义 + 运算符重载方法
  def +(other)
    Vector.new(@x + other.x, @y + other.y)
  end

  # 定义 to_s 方法,用于打印对象
  def to_s
    "(#{@x}, #{@y})"
  end
end

# 创建两个向量对象并相加
v1 = Vector.new(1, 2)
v2 = Vector.new(3, 4)
puts v1 + v2  # 输出: (4, 6)
相关推荐
兜兜风d'3 小时前
RabbitMQ TTL机制详解
分布式·rabbitmq·ruby
凯子坚持 c3 小时前
Docker LXC深度解析:从基础概念到实战演练
java·开发语言
m0_748233643 小时前
jank实现C++无缝互操作的技术探索
开发语言·c++
污斑兔4 小时前
技术随笔:Node.js ESM 中巧用 `-r dotenv/config` 解决环境变量异步加载问题
开发语言·r语言·node.js
ALex_zry4 小时前
C++中使用gRPC over Unix Domain Sockets的高性能进程间通信技术解析
开发语言·c++·unix
小年糕是糕手4 小时前
【C语言】函数栈帧的创建和销毁
java·c语言·开发语言·数据结构·c++·链表
ALex_zry4 小时前
构建通用并发下载工具:用Golang重构wget脚本的实践分享
开发语言·重构·golang
努力努力再努力wz4 小时前
【Linux进阶系列】:信号(下)
java·linux·运维·服务器·开发语言·数据结构·c++
21号 14 小时前
21.事务和锁(重点)
开发语言·数据库