oop/equality/not_equal_parens.rb

tests/_examples/oop/equality/not_equal_parens.rb in the metorex repository.

# `!=` is the negation of `==`, so defining only `==` gives a class both.

class Tagged
  attr_reader :tag

  def initialize(tag)
    @tag = tag
  end

  def ==(other)
    other.is_a?(Tagged) && tag == other.tag
  end
end

first = Tagged.new(:a)
same = Tagged.new(:a)
other = Tagged.new(:b)

puts((first == same).to_s)
puts((first != same).to_s)
puts((first != other).to_s)
puts(first.send(:!=, same).to_s)
puts(first.send(:!=, other).to_s)

# A class whose `==` always answers true is never unequal.
class AlwaysEqual
  def ==(other)
    true
  end
end

always = AlwaysEqual.new
puts((always != 1).to_s)
puts((always != "anything").to_s)

# Without a definition, `!=` falls back to identity for plain objects.
plain = Object.new
puts((plain != plain).to_s)
puts((plain != Object.new).to_s)

Output:

true
false
true
false
true
false
false
false
true