🐕

[Feature #21157] <> 演算子を追加する提案

2025/03/04に公開

[Feature #21157] Comparison operator <>

  • 以下のような比較を行う <> 演算子を追加する提案
# 異なる値の場合は <=> と同等の値を返す
# 左辺が大きれば 1
# 右辺が大きれば -1
1 <> 2 # => -1
2 <> 1 # => 1

# 同じ値の場合は false を返す
1 <> 1 # => false

# オブジェクト同士が比較できな場合は true を返す
1 <> "a" # => true
  • <> 演算子ってなんじゃろ、と思ったけど != と同様の不等演算子として利用されることが多いのかな
  • 上記の例でも『値が同じ場合は false を返し、そうでない場合は真を返す』みたいな挙動になっていますね
  • チケットでは以下のような仕様例が提示されています
Point = Struct.new(:x, :y)
array = [Point.new(1, 2), Point.new(6, 4), Point.new(2, 2), Point.new(5, 2)]

# y 同士で比較し、y が同じ場合は x 同士で比較するようなソートを行う
# y は昇順で x は降順でソートする
array.sort{|a, b| a.y <> b.y || b.x <> a.x || 0 }
# => [#<struct Point x=5, y=2>, #<struct Point x=2, y=2>, #<struct Point x=1, y=2>, #<struct Point x=6, y=4>]
  • 単に複数のキーでソートしたいなら以下のように配列で比較すればよいと思ったんですが上記のように yx昇順 / 降順 が異なるようにする場合はシュッとやるのむずそうですねえ
    • 数値であれば [_1.y, _1.x] みたいな形で実現はできそうだけどそれ以外の場合はむずそう
Point = Struct.new(:x, :y)
array = [Point.new(1, 2), Point.new(6, 4), Point.new(2, 2), Point.new(5, 2)]

pp array.sort_by { [_1.y, _1.x] }
# => [#<struct Point x=1, y=2>, #<struct Point x=2, y=2>, #<struct Point x=5, y=2>, #<struct Point x=6, y=4>]
array.sort{|a, b| (a.y <=> b.y).nonzero? || b.x <> a.x}
  • 現状だと『 #nonzero? で実現できるのであれば新しい演算子を追加するほどでもない』という感じみたいですねー
GitHubで編集を提案

Discussion