【Ruby】eql、equal、==、===

在Ruby中,eql?equal?===== 都是用于比较对象的方法,但它们有不同的用途和语义。以下是对每个方法的详细解释和比较:

== 操作符

用途

== 用于一般的等价性比较,比较两个对象的值是否相等。其行为是类可以自定义的,因此在许多内置类中,== 被重定义为进行值比较。

示例

puts 1 == 1         # true
puts "hello" == "hello"  # true
puts [1, 2] == [1, 2]    # true

class MyClass
  attr_accessor :value

  def initialize(value)
    @value = value
  end

  def ==(other)
    other.is_a?(MyClass) && other.value == @value
  end
end

obj1 = MyClass.new(10)
obj2 = MyClass.new(10)

puts obj1 == obj2  # true

eql? 方法

用途

eql? 用于更严格的比较,不仅要比较值,还要比较类型。在哈希表的键比较中,eql? 常用于检查两个键是否相同。

示例

puts 1.eql?(1)        # true
puts 1.eql?(1.0)      # false (不同类型)
puts "hello".eql?("hello")  # true
puts :symbol.eql?(:symbol)  # true

class MyClass
  attr_accessor :value

  def initialize(value)
    @value = value
  end

  def eql?(other)
    other.is_a?(MyClass) && other.value == @value
  end

  def hash
    @value.hash
  end
end

obj1 = MyClass.new(10)
obj2 = MyClass.new(10)

puts obj1.eql?(obj2)  # true

equal? 方法

用途

equal? 方法用于对象身份比较,即判断两个对象是否是同一对象(同一内存地址)。这个方法不能被重定义,是 Ruby 提供的用于检测两个对象是否在内存中是同一个对象的原始方法。

示例

a = "hello"
b = "hello"
c = a

puts a.equal?(b)  # false(虽然值相同,但不是同一个对象)
puts a.equal?(c)  # true(同一个对象)

=== 操作符

用途

=== 操作符用于不同的上下文中,通常称为“case equality” 或“三元运算符(triple equals)”。其行为也可由类重定义。主要用于 case 语句中进行模式匹配,但在其他情况下也可以提供更多语义。

示例

case 42
when 1..50
  puts "In range 1 to 50"
when Integer
  puts "An integer"
when String
  puts "A string"
else
  puts "Something else"
end

# Range
puts (1..10) === 5       # true
puts (1..10) === 15      # false

# Regexp
puts /ell/ === "hello"   # true

# Class
puts String === "hello"  # true
puts Integer === 42      # true

总结

以下是每个方法和操作符的对比:

  • ==: 用于一般的等价性比较,可以在不同类中重载这个操作符来定义什么是“等价”的。
  • eql?: 用于更加严格的比较,不仅要值相同,还要类型相同,主要用于哈希键比较。
  • equal?: 用于对象身份比较,判断是否是同一内存中的对象,不能被重定义。
  • ===: 用于模式匹配,可以在 case 语句中使用,也可以用在自定义类中来实现特定的匹配逻辑。

每个方法和操作符都有其特定的用途和语义,选择它们的使用取决于你具体的需求。例如,== 更适合一般的值相等判断,而 eql? 则适合哈希表中的键比较,equal? 则用于判断对象身份是否一致, 而 === 通常用于模式匹配。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值