Rubyの4つの比較関数(equal?, eql?, ==, ===)について解説します。
Rubyにはequal?, eql?, ==, ===という4つの比較メソッドがあり、クラスによって挙動が大きく異なる。また、それらを使用する際に混乱しがちです。このブログでは、それぞれのメソッドについて、いくつかのコードを示して説明します。
== - クラスの意味で同等、各クラスは独自の実装を定義する必要があります。
ある特定のクラスで2つのオブジェクトが同一だと感じるかどうかは、ビジネスの論理的な表現を見て、すべてプログラマがメソッドの定義を上書きして、2つのオブジェクトが同一かどうかを判断する必要があるのです。
例えばStringクラスは、同じメモリ領域から出てきたかどうかを気にするのではなく、実際の文字列が同じかどうかを数えるためにここにあるのです。
>> a = "abc"
#=> "abc"
>> b = a + ""
#=> "abc"
? > a == b
#=> true
>> a.object_id
#=> 70255156346640
>> b.object_id
#=> 70255156340640
=== - case文の中で使用されたときに呼び出されるメソッド
このメソッドは通常、次のような大文字小文字の比較で呼び出されます。
case some_object
when /a regex/
# The regex matches
when String
# some_object is kind of String
when 2..4
# some_object is in the range 2..4
when lambda {|x| some_crazy_custom_predicate }
# the lambda returned true
end
は、以下と同等です。
if /a regex/ === some_object
# The regex matches
elsif String === some_object
# some_object is kind of object
elsif (2..4) === some_object
# some_object is in the range 2..4
elsif lambda {|x| some_crazy_custom_predicate } === some_object
# the lambda returned true
end
eql? - 通常のイコールの意味
2つのオブジェクトが同じ値を持つ場合に真を返します。一般に、サブクラスの == メソッドが再定義されると、eql?メソッドへのエイリアスが必要になります。もちろん、整数と分数を比較する2つのメソッドの戻り値が異なるような例外はあります。
1 == 1.0 #=> true
1.eql? 1.0 #=> false
eql?はHashでメンバの値を比較するために使用されます。
[1] pry(main)> hash = Hash.new
#=> {}
[2] pry(main)> hash[2] = "a"
#=> "a"
[3] pry(main)> hash[2.0] = "b"
#=> "b"
[4] pry(main)> hash[2]
#=> "a"
[5] pry(main)> hash[2.0]
#=> "b"
[6] pry(main)> hash[2.00] = "c"
#=> "c"
[7] pry(main)> hash[2.0]
#=> "c"
したがって、このメソッドをいつオーバーライドすべきかは、Hash比較の際にどのように動作させたいかによります。
イコール?- オブジェクトが同じメモリアドレスの場合
このメソッドはサブクラスでオーバーライドしないでください。
比較対象は、2つのオブジェクトがメモリ上で同じであり、かつ同じ object_id 値を持つかどうかである
Railsで時間的に同一なオブジェクト
q = User.first
User Load (40.4ms) SELECT "users". * FROM "users" ORDER BY "users". "id" ASC LIMIT 1
#=> #<User id: 1, email: "[email protected]">
q2 = User.first
User Load (0.4ms) SELECT "users". * FROM "users" ORDER BY "users". "id" ASC LIMIT 1
#=> #<User id: 1, email: "[email protected]">
q.equal? q2
#=> false
メモリーメソッド
- == ビジネスに必要なメソッドをオーバーライドする
- === caseステートメントをオーバーライドする際のパフォーマンス
- eql? メソッドのエイリアスで、Hashの比較を変更する必要がある場合はメソッドをオーバーライドします。
- イコール?変更なし
関連
-
最新のCocoaPodsインストールチュートリアル
-
Ruby on rails install to remove DL is deprecated, please use Fiddle warning message method [test available].
-
バブルソートアルゴリズムの簡易実装とRuby版
-
Luhnアルゴリズムの学習とそのRuby実装コード例
-
RubyでXMLデータ処理ライブラリREXMLを使うための手引き
-
RubyのプログラムでXML形式のデータをパースするためにREXMLを呼び出す例
-
Rubyの文字列と配列の最大化問題の考察
-
Ruby on Railsのルーティング設定に関するいくつかのアドバイス
-
Rubyでの例外処理コードの記述例
-
Rubyでの正規表現の使い方基本ガイド
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Ruby変数の詳細分析
-
win7でrubyのソースコードからコンパイルしてインストールする方法
-
モンキーパッチのプログラミングスタイルとRubyでの利用について
-
RubyのMonkey Patchの開発例
-
Ruby Hash ハッシュ型 基本操作のメソッド一覧 まとめ
-
Windowsでrubyとrailsをインストールする際に発生する問題点まとめ
-
Ruby on Railsで構築するアプリケーションの基本的なディレクトリ構造のまとめ
-
CentOS7でruby on railsの開発環境を構築する。
-
Ruby on RailsにおけるCucumberの活用を解説します。
-
Rubyで配列とハッシュテーブルを使う