2014-10-15 2 views
1

다트 질문 : "내 생각에" "정상적인 동작"을 표시하려면 명시 적으로 설정하지 않고 키 - 값 쌍의 값을 변경하지 마십시오 :명시 적으로 설정하지 않고 다트 - 맵 값이 변경됨

Map<String,String> mup = {}; 
mup['a']='fred'; 
var val = mup['a'];// val==fred 
val = 'joe'; 
print(mup); // (a: fred} - unchanged 
mup['a']=val; //set 
print(mup); // (a: joe} - changed OK 

이상한 방법으로 보여 주지만 놀라운 것은 없습니다. 값이 목록 인 경우 목록의 값이 변경되는 경우 그러나,지도는 즉시 업데이트됩니다

Map<String,List> mup = {}; 
mup['a']=[1,2,3,4,5,6]; 
var val = mup['a']; 
val[1]=66; 
print (mup);//{a: [1, 66, 3, 4, 5, 6]} 

그래서 MUP가 변경된 명시 적으로 변경하지 않고! 무슨 일 이니 ... 제발?

나에게 놀랍지 만, 나는 이다. 초보자! 스티브

답변

1

var val = mup['a']

목록 [1,2,3,4,5,6]없는 사본에 대한 참조를 반환합니다.
수정하면 실제로 동일한 목록 인지도 내부의 목록에도 반영됩니다.

기본적으로 상자에서 같은 것을 보지만 두 개의 다른 구멍에서 보게됩니다.

+0

@ mezoni. 둘 다 고마워. 나는 그것이 불변의 문자열에 적용되지 않는 이유를 알 것 같지만, 객체 인 int (그냥 테스트 한지도 )에는 적용되지 않는다. 왜 안돼? S – Lymp

+0

'int' 또한 불변입니다. 'int'의 값을 변경할 수 없습니다. 다른 인스턴스 (다른 값) 만 지정할 수 있습니다. –

0

이 시나리오를 가정하십시오.

  1. 방은지도입니다.
  2. 이 방에 숙박하십시오.
  3. 가방에는 숫자 1,2,3,4,5,6이있는 카드가 있습니다.
  4. 번호가 2 인 카드를 제거하고 번호 66 인 다른 카드를 가방에 넣습니다.
  5. 아직 방에 있습니다.

제발, 저에게 답변하십시오 : 방을 바꾸시겠습니까?

P.

최소한 두 가지 유형이 동일한 지 확인하십시오.

기본 방법은 동일한 평등입니다.

즉, 일부 유형의 인스턴스에 사용자 정의 연산자 "=="이 없으면 항상 참조로 비교됩니다.

귀하의 경우 List 인스턴스를 변경하지만 참조가 비교되는 Dart 목록에서는 ("=="연산자가 없으므로) 참조로만 비교됩니다.

다트의지도 또한 자신과 비교되지 않습니다.

지도와지도를 나란히 비교하려고해도 다트의 목록이 참조로 비교되기 때문에 차이점을 찾을 수 없습니다.

즉, 동시에 옳고 그른 것을 의미합니다.

모두는 인스턴스를 비교하는 방법에 따라 다릅니다.

다른 경우 결과가 달라집니다 (관점).

관련 문제