Scala가 Java 에서처럼 '*'대신 패키지 가져 오기에 '_'연산자를 사용하는 이유는 무엇입니까?


17

제 생각에 Scala의 가장 큰 장점 중 하나는 Java와의 상호 운용성 및 유사한 구문입니다. 내가 이상한 것을 발견 한 것은 Java에서 사용되는 연산자 _대신 패키지 wilcard 가져 오기에 *연산자를 사용한다는 것입니다.

_대신에 기술적 인 이유 가 *있습니까? 그렇지 않다면 왜이 변경이 이루어 졌습니까?


이것은 단지 기능적인 것일 수 있습니다. Haskell은 와일드 카드 / 지정되지 않은 값으로 작동하기 위해 몇 곳에서 _를 사용한다는 것을 알고 있습니다.
KChaloux

답변:


36

스칼라에서는 *유효한 식별자입니다. 하나는 쓸 수 있습니다 :

val * = "trollin'"
println(*)

결과는 다음과 같습니다.

trollin'

다음 *과 같은 이름의 클래스를 작성할 수 있습니다 .

class * {
  def test():String = {
    "trollin'"
  }
}

따라서 *패키지에 클래스 가 있고 us.hexcoder쓸 때 :

import us.hexcoder.*

이름이 인 클래스를 가져오고 싶다고 말할 것 *입니다. 이로 인해 스칼라는 다른 기호를 사용하여 와일드 카드 가져 오기를 표시해야했습니다. 어떤 이유로 든 그들은 _와일드 카드 기호 로 사용하기로 결정했습니다 .


9
그러면 질문은 왜 *가 유효한 식별자로, _는 와일드 카드로 선택 되었습니까?
Mike Partridge

2
내가 더 많은 투표를했지만 이것은 더 정답입니다. 전에 식별자로 *를 들어 본 적이 없습니다.
Michael Brown

1
@MikeBrown Lisp에서도 유효합니다. 다음은 Scheme

18
@MikePatridge 스칼라는 모든 연산자를 함수로 정의하고 개발자가 자체 연산자를 정의 할 수 있기 때문에 거의 확실합니다. 연산자에 대해 특수한 구문을 사용하지 않으며 *곱셈에 포함되어야했습니다. 따라서 덜 일반적인 다른 캐릭터를 예약 된 캐릭터로 선택해야했습니다.
KChaloux

3
_ 문자는 공백과 유사합니다 ( "빈칸 채우기"에서와 같이). 스칼라가 다른 곳에서 빌려 왔거나 스스로 가져 왔을 때 와일드 카드로 사용하는 것이 좋습니다.
Michael Shaw

13

기능적 언어에서 _ 문자는 일반적으로 "이 매개 변수에 관심이 없습니다"또는 "여기에 무엇이든지 갈 수 있습니다"라고 말하는 데 사용됩니다. 해당 값을 네임 스페이스 가져 오기로 확장하는 것은 의미가 있습니다.


2

Glenn의 답변 외에도 importScala의 어느 곳에서나 유효한 진술 import이며 객체 또는 인스턴스 멤버를 범위에 포함 시킬 수 있습니다 . 으로 *분명히 많은 클래스의 구성원, 그것은 와일드 카드로 사용할 수 없습니다 import문. 따라서 유효한 식별자가 아닌 문자열로 끝납니다.

_생각 나다. 다른 장소에서 다른 의미 (실존 유형, 인스턴스 기능)로 사용된다는 사실도 같은 문제로 인한 것입니다.


0

스칼라에는 밑줄이 사용되는 수십 곳 이 있습니다. 와일드 카드 가져 오기에 사용하는 것은 논리적 결과입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.