Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 |

2006-08-24(Thu)

#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

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hake/20060824/p3