strings/ordering_and_case_no_parens.rb

tests/_examples/strings/ordering_and_case_no_parens.rb in the metorex repository.

# A String orders against anything that reads as one, then against anything
# that orders itself, and has no order at all with anything else.
class Spelled < String
end
p "hello" <=> Spelled.new("hello")

class Reads
  def to_str
    "aaa"
  end
end
p "abc" <=> Reads.new

class Orders
  def <=>(other)
    -1
  end
end
p "abc" <=> Orders.new
p "abc" <=> 7

# Two strings whose bytes are the same but whose encodings are not are ordered
# by where those encodings sit in the list Ruby keeps.
one = [0xFF].pack("C").force_encoding("utf-8")
two = [0xFF].pack("C").force_encoding("iso-8859-1")
p one <=> two
p two <=> one

# A Symbol compares its case only against another Symbol.
p :aBcDeF.casecmp(:abcdef)
p :abc.casecmp("abc")
p :abcdef.casecmp?(:ABCDEF)

# Only an encoding that spells the whole of Unicode maps a letter outside
# ASCII onto another case of itself.
p :"Ã".casecmp?(:"ã")
p "\xC3".b.to_sym.casecmp?("\xE3".b.to_sym)

Output:

0
1
1
nil
-1
1
0
nil
true
true
false