2017-01-16 5 views
1

Pharo Smalltalk에서 ===의 차이점은 무엇입니까? 이름이 뭐지, 하나는 isEqual이고 다른 하나는 무엇입니까?Pharo Smalltalk에서 =와 ==의 차이점은 무엇입니까?

= ~= equality/inequality (deep) 
== ~~ equality/inequality (shallow) 
+4

'='은 * equality * (객체는 값이 동일 함)를 참조하고 '=='는 * identity * (객체는 동일 함)를 참조합니다. [동일성 대 정체성] (http://esug.org/data/HistoricalDocuments/TheSmalltalkReport/ST05/10wo.pdf)을 참조하십시오. – lurker

답변

2

== 신원이며 포인터 같은 어드레스 (즉, 동일한 오브젝트)를 가리킬 경우 비교 원시를 사용한다.

=은 두 개체가 같을지라도 두 개체가 같음을 의미하는 등호입니다. 기본적으로 ===을 사용하지만 다시 구현할 수 있습니다. 당신이 =을 구현할 때 또한이

+0

이름 지정은 어떻게됩니까? 하나는 "동일하다"는 "다른 하나는"와 동일 "또는"동일하다 "는 의미입니까? – unmircea

+0

@unmircea 나는 동일하고 동일하다고 생각하지만 일반적으로 "equal"을 사용하고'=='에 대해서 말합니다 : _ 동일한 객체이면 _check_ – Uko

0

TL을 미쳐하지 않습니다 또한 hash 때문에 해시 컬렉션을 재 구현하는 것이 좋습니다 것, DR은 : = "같음", == : 개체에서

>> "같은"# = ProtoObject에서

= anObject 
"Answer whether the receiver and the argument represent the same 
object. If = is redefined in any subclass, consider also redefining the 
message hash." 

^self == anObject 

>> # ==

== anObject를 "원시. 수신기 및 인수가 같은 오브젝트 (동일한 개체 포인터가)을인지 답변. 다시 정의하지 마십시오 t 그는 어떤 다른 클래스 에서 메시지 ==! 본질적인. 조회가 없습니다. 하위 클래스에서 재정의하지 마십시오. == 당신이 무시할 수 있습니다, 그래서

<primitive: 110> 
self primitiveFailed 

. "개체 문서 whatIsAPrimitive를 참조 =하지만.

FWIW ProtoObject subclass: #Object

에게 #의 예 = 재정의

'= ABAG입니다 "두 봉지는 같음 (a) 그들은 같은 종류의 것입니다. (b) 크기가 같습니다. 은 (C) 각 요소는 둘 다에 동일한 횟수를 발생 "(재미있는"

(aBag isKindOf: Bag) ifFalse: [^false]. 
self size = aBag size ifFalse: [^false]. 
contents associationsDo: [:assoc| 
    (aBag occurrencesOf: assoc key) = assoc value 
     ifFalse: [^false]]. 
^true` 

어느, Dictionary에 비해 상당히 다른 짐승의 바스의 구현)입니다. "

`사전 >> # = aDictionary "두 사전은 인 경우 동일합니다 (a) 그것들은 같은 '종류'의 것입니다. (b) 키가 동일합니다. (c) 각 (공통) 키의 값은 동일합니다. 참조 문제 16760

self == aDictionary ifTrue: [^true]. 
self species == aDictionary species ifFalse: [^false]. 
self size = aDictionary size ifFalse: [^false]. 
self associationsDo: [:assoc| 
    (aDictionary at: assoc key ifAbsent: [^false]) = assoc value 
     ifFalse: [^false]]. 
^true` 

흥미롭게도 그들은 같은 hash 방법을 공유 "변경하기 전에.

`컬렉션 >> # 해시 "- 불변 오브젝트의 해시 값이 시간에 걸쳐 일정하고, - 정수 해시 예컨대, 그 수신기의 가치 원치 동일한 두 물체가 동일한 해시 값을 갖는다" 자기 크기 < = 10 약간의 냄새가있다

| hash | 

hash := self species hash. 
self size <= 10 ifTrue: 
    [self do: [:elem | hash := hash bitXor: elem hash]]. 
^hash bitXor: self size hash 

` 은 재미 이러한 호출을 추적 있습니다.

기본적인 오브젝트의 경우, 다음을 참조하십시오

Magnitude>>#hash implementers

재밌게 탐험.

스팟 터에서 hash #im 또는 = #im은 구현 자 목록을 제공하므로 사용자는이를 신속하게 찾을 수 있습니다. 고려해야 할

enter image description here

+1

'xor' 기반 해시는 일반적으로 'xor'ed 된 요소보다 높은 비트 수를 사용하지 마십시오. –

1

한 가지 중요한 것은 코드가 두 개체를 비교할 때 =가 명시 적으로 사용되지 않는 것입니다. includes:, <=, >=, remove:, keyAtValue:, indexOf:, upTo:, peekFor:, occurrencesOf:, add: (Set에서), at: (친구 at:ifAbsent:, at:ifAbsentPut: 등 : 메시지 =는 암시 또한 많은 다른 메시지에 의해 사용입니다), 그리고 많은 다른 사람들.

는 클래스에 =를 재정의 할 때 당신은 또한 = 당신을 다시 정의

  1. =의 구현이 강력
  2. 마다하고 (예, banana = car이 오류를 제공하지 않습니다) 있는지 확인해야 함을 의미 hash을 재정의하십시오.

첫 번째 조건에 대한 이유는 = 메시지를 전송하기 전에 특별히주의 할 필요 보낸 사람없이 두 개체를 비교할 수있다.

두 번째 이유는 미래에 당신의 객체가 해시 모음 (Set, Dictionary, Bag 등)에 사용하는 경우가 이러한 기관에서 필요로하는 중요한 불변을 존중하는 것입니다

 IF a = b THEN a hash = b hash 

그리고 hash 값이 SmallIntegers 있는지 확인하는 아주 좋은 방법입니다 주어진, 하나는 즉

 IF a = b THEN a hash == b hash 

, 두 객체가 고려 때마다 말할 수 이고 hash 값은 동일하게이되어야합니다.하나 ab 또는 a같다라고 = 같은 a = b로서 포함하는 식을 판독 할 때

명명


b 같다.

a == b 스몰 토크를 읽어

ab라고하는 동일한 개체이거나 ab 또는 a동일 동일하면a 또는 ab 동일 - 동일 동일하다.

또한 의견

= 메시지는 두 개의 스몰 토크 개체를 응용 프로그램에서 매우 동일한 개체를 나타낼 때를 결정하는 것은 여러분의 몫입니다 즉, 특정 영역입니다.

== 메시지는 시스템 기능으로, 비교 대상 개체가 메모리의 동일한 위치를 차지하고 있는지 확인하는 VM (가상 컴퓨터)에서 구현됩니다. 즉, 매우 동일한 객체에 바인딩 된 경우 두 개의 변수 ab등가입니다.

a := 'This String'. 
b := 'This' , ' ', 'String'. 
a == b "false". 
a = b "true" 

f := 2/3. 
g := 2/3. 
f = g "true". 
f == g "false" 

은 일반적으로 VM은 특별한 방식으로 인코딩 때문에 ===되어 있습니다 SmallInteger의 말하기.

n := 3 + 4. 
m := 2 + 5. 
n = m "true". 
n == m "true". 

또 다른 흥미로운 경우는 클래스 Symbol 클래스는 동일한 기본 문자열로 두 개의 인스턴스가 적 환경에 존재하지 않습니다 있는지 확인합니다 때문에이 문제가 발생 Symbol

s := #symbol. 
t := 'symbol' asSymbol. 
s = t "true". 
s == t "true!" 

의 경우에 발생합니다.

+0

이름 지정은 어떻게됩니까? 하나는 "동일하다"는 "다른 하나는"와 동일 "또는"동일하다 "는 의미입니까? – unmircea

+1

@unmircea'= '는 "같음"또는 "같은 값을 가짐"을 의미합니다. '=='는 "is same"또는 "is same as same object"를 의미합니다. – lurker