2013-12-15 3 views
1

은 내가 Map 이런 식으로 구축 할 수 있습니다 :'->'연산자가 있습니까? 그것은 무엇을 반환합니까? 스칼라에서

val map = Map(1 -> "one", 2 -> "two", 3 -> "three") 

을하지만 그것은 무엇을합니까? 인수는 평가되어야하므로 1 -> "one"에 값이 있습니다. 이게 뭐야?

scala> 1 -> "one" == (1, "one") 
res1: Boolean = true 

그래서 차이점은 무엇입니까 :

나는이 표현이 true를 돌려 발견?

+3

스칼라에는 운영자 **는 모든 (단지 이상한 이름을 가진) 방법 ** 없다. – Eastsun

+0

Eastsun> 특히 객체를 중위 연산자라고 부르는 경우에는 객체에 대한 단일 정렬 방법을 연산자로 보는 것이 유익하다고 생각합니다. – Felix

+0

여기에 객체를 말할 때, 물론 클래스의 인스턴스를 의미합니다 (혼란스럽게 생각하면 Scala : P에서 너무 많은 배설물 키워드) – Felix

답변

6

클래스 ArrowAssoc (http://www.scala-lang.org/api/current/scala/Predef$$ArrowAssoc.html)입니다. 모든 미리 가져온 방법이 포함 된 객체 Predef (http://www.scala-lang.org/api/current/scala/Predef$.html)을 찾습니다. 여기서 -> 메서드를 호출 할 수있는 암시 적 변환 인 메서드 any2ArrowAssoc[A](x: A): ArrowAssoc[A]을 찾아야합니다.

이 응답에 자세히 설명하려면이 다음과 같은 코드가 예에서 암시 있음을 의미합니다 :

scala> 'a' -> 1 == (any2ArrowAssoc('a').->(1)) 
res0: Boolean = true 
1

간단히 말해 Pair (또는 Tuple2) 유형의 확장 방법 일뿐입니다. 만약 당신이 scala에서 Map 타입을 살펴 본다면, 그것은 2의 쌍 또는 튜플로 구성되어 있다는 것을 알 것입니다. key value 연관 key -> value을 나타 내기 위해 Map 구조로 특별히 정의되었지만, 당신은 쉽게 Map(("a", 1), ("b", 2))을 쓸 수 있습니다. Map("a" -> 1, "b"-> 2)과 동일합니다. 따라서 1 -> "one" == (1, "one")은 같기 때문에 동일합니다. 스칼라에서 책 "스칼라 프로그래밍"에서 PREDEF 개체

+1

'Pair에 대한 확장 메소드 일뿐입니다.'T 타입의 확장 메소드 인 Pair [T, ...]'를 반환하는 것을 의미하는 것 같습니다. – senia

+0

예 답변을 편집해야합니다. @senia가 말했듯이,'Pair' /'Tuple2'에 대해서는 _not_와 확장 메서드가 아닙니다; 즉 그 메소드의 _result_입니다.'any2ArrowAssoc'에 의해 _any_ 타입으로 정의됩니다. –

1

에서 암시 적 클래스 (http://booksites.artima.com/programming_in_scala_2ed)로 ->is defined :

스칼라 컴파일러는 (1).->("Go to island.")1 -> "Go to island." 같은 이항 연산 식을 변환합니다.

따라서, 당신은 1 -> "Go to island.", 당신은 실제로 당신이 어떤 객체에 호출 할 수있는 가치 "Go to island."

-> 방법으로 문자열을 전달 값 1와 정수에 ->라는 메서드를 호출 말할 때 스칼라 프로그램에서 키와 값을 포함하는 두 요소 튜플을 반환합니다.

임의의 개체에서 암시 적 변환 인 ->을 호출 할 수있는 스칼라 메커니즘입니다.

관련 문제