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)
相关推荐
晨曦夜月26 分钟前
笔试强训day7
开发语言·c++·算法
Kurbaneli29 分钟前
先啃C语言还是直奔目标?
开发语言
weixin_307779131 小时前
Jenkins Pipeline 完全指南:核心概念、使用详解与最佳实践
开发语言·ci/cd·自动化·jenkins·etl
kk”1 小时前
c++红黑树
开发语言·c++
Gomiko1 小时前
JavaScript DOM 原生部分(二):元素内容修改
开发语言·javascript·ecmascript
Z_W_H_1 小时前
【C#】C#中值类型和引用类型参数传递的区别
开发语言·c#
Data_agent1 小时前
实战:用Splash搞定JavaScript密集型网页渲染
开发语言·javascript·ecmascript
leiming61 小时前
C++ 02 函数模板案例
开发语言·c++·算法
weixin_421585011 小时前
PYTHON 迭代器1 - PEP-255
开发语言·python
小新1101 小时前
vs2022+Qt插件初体验,创建带 UI 界面的 Qt 项目
开发语言·qt·ui