6

重複している場合は申し訳ありません(見つかりませんでした)

==これは、Rubyの演算子が常に等価比較を実行することを確認するためだけのものです。つまり

a == b

Javaのように、メモリ内の同じオブジェクトを指しているかどうかではなく、aの値をbの値と比較します(後者の場合、Rubyではa.object_id == b.object_id)を使用する必要があります。

したがって、結果として、Rubyでは文字列値を==と比較するのが安全です(Javaでは安全ではありませんが)

ありがとう

編集

問題は、Rubyオブジェクトのデフォルトの==動作にあります。これは、a == bが参照の内容ではなく、参照自体を比較すると仮定して、Java-C-C++プログラマーを誤解させる可能性があるためです。

とにかく、文字列を使用してこのコードをチェックアウトできます

one="hello"
two="he"
two << "llo"

if one == two
  puts "surprise: comparing values, not like in Java"
end

if not one.object_id == two.object_id
  puts "obvious: do this to compare references"
end

編集2

したがって、Rubyでは、比較

a == b

aとbの値をチェックします

しかし、割り当て

a = b

値をコピーしませんが、aとbが同じオブジェクトを指すようにします!

前のコードを続行する

puts one.object_id
puts two.object_id

puts " and now "

one = two

puts one.object_id
puts two.object_id
4

3 に答える 3

3

Rubyでは、==オーバーロードできるので、比較しているクラスの設計者がやりたいことは何でもできます。その点で、Javaのequals()方法と非常によく似ています。

規則は==値の比較を行うためのものであり、ほとんどのクラスはString含まれているその規則に従います。つまり、文字列の比較に使用==すると、期待どおりの結果が得られます。

規則はequal?参照比較を行うためのものであるため、テストa.object_id == b.object_idを作成することもできますa.equal?(b)。(このequal?メソッドは、非標準的なことを行うように定義できますが、それでも可能object_idです!)

(補足:Rubyで文字列を比較している場合は、代わりに記号を使用する必要があります。)

于 2012-09-15T08:34:27.130 に答える
1

http://www.skorks.com/2009/09/ruby-equality-and-object-comparison/から。

コード:

class MyObject
end
object1 = MyObject.new
object2 = object1
object3 = MyObject.new

puts "Object 1 is == to object 2: #{object1 == object2}"
puts "Object 1 is eql? to object 2: #{object1.eql? object2}"
puts "Object 1 is equal? to object 2: #{object1.equal? object2}"
puts "Object 1 is == to object 3: #{object1 == object3}"
puts "Object 1 is eql? to object 3: #{object1.eql? object3}"
puts "Object 1 is equal? to object 3: #{object1.equal? object3}"

出力:

Object 1 is == to object 2: true
Object 1 is eql? to object 2: true
Object 1 is equal? to object 2: true
Object 1 is == to object 3: false
Object 1 is eql? to object 3: false
Object 1 is equal? to object 3: false

編集-追加出力:

irb(main):001:0> class MyObject
irb(main):002:1> end
=> nil
irb(main):003:0> object1 = MyObject.new
=> #<MyObject:0x281bc08>
irb(main):006:0> object1.respond_to?( '=='.to_sym )
=> true
irb(main):007:0> object1.respond_to?( 'eql?'.to_sym )
=> true
irb(main):013:0> MyObject.superclass
=> Object
于 2012-09-15T08:35:08.870 に答える
0

「Rubyプログラミング言語」(Flanagan&Matsumoto)によると、セクション4.6.7、106ページ

==は等式演算子です。左側のオペランドの「等しい」の定義に従って、2つの値が等しいかどうかを判別します。

そして3.8.3ページ74:

すべてのオブジェクトには、object_idメソッドで取得できるオブジェクト識別子Fixnumがあります。このメソッドによって返される値は一定であり、オブジェクトの存続期間中は一意です。

したがって、これはJavaとは逆に機能します(私にとっては驚きです)。

于 2012-09-15T10:36:37.720 に答える