불변 Set
콜렉션에서 toSeq
을 호출하면 ArrayBuffer
이됩니다.스칼라의 toSeq가 불변 Set를 변경 가능한 ArrayBuffer로 변환하는 이유는 무엇입니까?
scala> Set(1,2,3).toSeq // returns Seq[Int] = ArrayBuffer(1, 2, 3)
놀랍습니다. 스칼라가 불변의 데이터 구조를 사용하는 것에 중점을 두어, ArrayBuffer
대신에 Vector
또는 List
과 같은 변경 불가능한 시퀀스를 되 찾을 것으로 기대된다. set 요소의 반환 된 순서는 물론 정의되지 않아야하지만 순서가 변경 가능해야하는 의미 론적 이유는없는 것으로 보입니다.
일반적으로 나는 스칼라 연산이 명시 적으로 변경 가능한 것을 요구하지 않는 한 항상 불변의 결과를 생성 할 것으로 기대한다. 이것은 내 가정 이었지만 여기서는 잘못된 것이 었습니다. 실제로 ArrayBuffer
이 예기치 않게 존재하여 match
문에서 런타임 오류가 발생하는 한 시간을 보냈습니다. 내 픽스는 Set(...).toSeq
을 Set(...).toList
으로 변경했지만 해킹과 같은 느낌이 들었습니다. 그 시점에서 특히 목록이 필요한 응용 프로그램에 대한 정보가 없기 때문입니다.
Set(...).toSeq
은 스칼라 구현에서 결함이있는 객체를 반환하거나 여기에 오해의 원칙이 있습니까?
이것은 스칼라 2.9.2입니다.
2.10-RC2에 고정'스칼라> 서열 (1,2,3) .toSeq' -> '이 res0 서열 [지능] = 목록 (1, 2, 3) ' – senia
@senia, Seq (1,2,3) .toSeq 대신'Set (1,2,3) .toSeq'을 사용하셨습니까? –
변경을 위해 투표하십시오 : [SI-6570] (https://issues.scala-lang.org/browse/SI-6570) –