hakeの日記

Windows環境でプログラミングの勉強をしています。

#include?の挙動

Rubyの勉強
include?は引数がArrayやHashのkeyの要素として含まれるか判断するメソッド。要素として自分で定義したクラスのオブジェクトを使用する場合、Arrayだと演算子<=>で判断されるが、Hashの場合は<=>では判断されない模様。
Array#include?と同じ感覚でHash#include?使用しないように注意が必要

追記

Hash#include?での比較はObject#eql?とObject#hashを使用しているのでこれをStrクラスの中で定義しなおせは良いらしいです。

class Str
  include Comparable
  attr_reader :str
  def initialize(str)
    @str = str
  end
  def <=>(other)
    @str <=> other.str
  end

  # 以下はHash#include?用追加部分
  # これでtrueになる
  def eql?(other)
    @str == other.str
  end
  def hash
    @str.hash
  end
end

a = Str.new("abc")
b = Str.new("abc")
p a                # => #<Str:0x2940050 @str="abc">
p b                # => #<Str:0x2940028 @str="abc">
p a == b           # => true

arry = [a]
p arry.include?(b) # => true
hash = {a => "a"}
p hash             # => {#<Str:0x2940050 @str="abc">=>"a"}
p hash.include?(b) # => false
p hash.include?(a) # => true