Pharo Smalltalk에서 =
과 ==
의 차이점은 무엇입니까? 이름이 뭐지, 하나는 isEqual
이고 다른 하나는 무엇입니까?Pharo Smalltalk에서 =와 ==의 차이점은 무엇입니까?
= ~= equality/inequality (deep)
== ~~ equality/inequality (shallow)
Pharo Smalltalk에서 =
과 ==
의 차이점은 무엇입니까? 이름이 뭐지, 하나는 isEqual
이고 다른 하나는 무엇입니까?Pharo Smalltalk에서 =와 ==의 차이점은 무엇입니까?
= ~= equality/inequality (deep)
== ~~ equality/inequality (shallow)
예 ==
신원이며 포인터 같은 어드레스 (즉, 동일한 오브젝트)를 가리킬 경우 비교 원시를 사용한다.
=
은 두 개체가 같을지라도 두 개체가 같음을 의미하는 등호입니다. 기본적으로 =
은 ==
을 사용하지만 다시 구현할 수 있습니다. 당신이 =
을 구현할 때 또한이
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
` 은 재미 이러한 호출을 추적 있습니다.
기본적인 오브젝트의 경우, 다음을 참조하십시오
재밌게 탐험.
스팟 터에서 hash #im
또는 = #im
은 구현 자 목록을 제공하므로 사용자는이를 신속하게 찾을 수 있습니다. 고려해야 할
'xor' 기반 해시는 일반적으로 'xor'ed 된 요소보다 높은 비트 수를 사용하지 마십시오. –
한 가지 중요한 것은 코드가 두 개체를 비교할 때 =
가 명시 적으로 사용되지 않는 것입니다. includes:
, <=
, >=
, remove:
, keyAtValue:
, indexOf:
, upTo:
, peekFor:
, occurrencesOf:
, add:
(Set
에서), at:
(친구 at:ifAbsent:
, at:ifAbsentPut:
등 : 메시지 =
는 암시 또한 많은 다른 메시지에 의해 사용입니다), 그리고 많은 다른 사람들.
이
는 클래스에=
를 재정의 할 때 당신은 또한 =
당신을 다시 정의
=
의 구현이 강력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
값은 동일하게이되어야합니다.하나 a
는b
또는 a
같다라고 =
같은 a = b
로서 포함하는 식을 판독 할 때
명명
는b
같다.
a == b
스몰 토크를 읽어
a
및b
라고하는 동일한 개체이거나 a
는b
또는 a
동일 동일하면a
또는 a
b
동일 - 동일 동일하다. 또한 의견
=
메시지는 두 개의 스몰 토크 개체를 응용 프로그램에서 매우 동일한 개체를 나타낼 때를 결정하는 것은 여러분의 몫입니다 즉, 특정 영역입니다.
==
메시지는 시스템 기능으로, 비교 대상 개체가 메모리의 동일한 위치를 차지하고 있는지 확인하는 VM (가상 컴퓨터)에서 구현됩니다. 즉, 매우 동일한 객체에 바인딩 된 경우 두 개의 변수 a
과 b
은 등가입니다.
예
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!"
의 경우에 발생합니다.
'='은 * equality * (객체는 값이 동일 함)를 참조하고 '=='는 * identity * (객체는 동일 함)를 참조합니다. [동일성 대 정체성] (http://esug.org/data/HistoricalDocuments/TheSmalltalkReport/ST05/10wo.pdf)을 참조하십시오. – lurker