質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

404閲覧

Ruby == よりもより厳密な比較を行いたい。

honmake

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2014/08/08 13:03

値が等しくても型が違えばfalseを返したいのですが、自分は、==しか知りません。

==より厳密な比較をしたいので、何か良い対策方法がありましたら教えてください。

宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Ruby の一致の比較には 値の一致==オブジェクトの一致equal? があります。
`
foo = "Hello"
bar = "Hello" # foo とは別オブジェクト
baz = foo # foo と同じオブジェクト

p bar == foo # true
p baz == foo # true

p bar.equal? foo # false
p baz.equal? foo # true
`

equal? には似た eql? というメソッドがあり、こちらはハッシュのキーの一致判定に使われるものです。デフォルトでは equal? と同じですが、クラスによっては、変更されていることがあります。
例えば somehash["Hello"] のように文字列をキーとするハッシュでは "Hello" のキーには常に同じ値を返す必要があります。
p bar.eql? foo # true 同じオブジェクトじゃないけど一致 p baz.eql? foo # true
このため、オブジェクトの一致には equal? を使います。

同一オブジェクトの判定ではなく、値と型が一致しているかをチェックしたいということでしたら、整数や文字列などであれば逆に eql? で対応可能だと思います。
ただ、もともとそのためのメソッドではないので、汎用的にするには値と型の両方をチェックする必要があります。
p bar == foo || bar.class == foo.class # true

投稿2014/08/11 03:06

yohshiy

総合スコア863

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

honmake

2014/08/19 02:25

回答ありがとうございます。 わかりやすい説明で、参考になりました。試してみたいと思います。
guest

0

eql?メソッドというのがあります。
こちらを利用されれば、質問者様が仰っておられる==よりも厳密な比較が実現できますよ。

例えば、==なら以下の場合はtrueを返してしまいます。

1.0 == 1

しかし、eql?メソッドを用いたらfalseが返ってきます。
(1.0).eql? 1

投稿2014/08/09 02:30

mameko312

総合スコア151

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問