문제

Scala에서 왜 도트와 브레이크를 생략 할 수 있습니까? T m 0 (대신에 T.m(0)) 다음에서?

scala> object T { def m(i:Int) = 0 == i }
defined module T

scala> T m 0
res19: Boolean = true

그러나 왜 내가 브라켓을 생략 할 수 없다 n(0) 다음에서?

scala> def n(i:Int) = 0 == i
n: (Int)Boolean

scala> n 0
<console>:1: error: ';' expected but integer literal found.
       n 0
         ^
도움이 되었습니까?

해결책

전자 예제 인 t m 0은 "연산자 표기법"의 예입니다. Scala에는 3 가지 유형의 연산자 표기법, 접두사 (단일), Infix 및 Postfix가 있습니다. 여기에서 행동중인 세 가지의 예를 살펴 보겠습니다.

class MyByte(val n : Int) {
  require(n >= 0 && n <= 255)
  def unary_! = new MyByte(n ^ 0xff)
  def +(m : MyByte) = new MyByte(n + m.n)
  def bits = (math.log(n) / math.log(2) + 1).toInt
  override def toString = "0" * (8 - bits) + n.toBinaryString
}

여기에 사용 중입니다.

scala> val a = new MyByte(5)
a: MyByte = 00000101

scala> val b = new MyByte(10)
b: MyByte = 00001010

scala> ! a  // Prefix/Unary
res58: MyByte = 11111010

scala> a + b  // Infix
res59: MyByte = 00001111

scala> b bits  // Postfix
res60: Int = 4

Infix 및 PostFix 표기법은 유효한 Scala 식별자를 허용하지만 PostFix 표기법을 제한하는 것에 대한 이야기가 있지만 4 개의 식별자 만 접두사로 사용할 수 있습니다 : ~,!, - 및 +.

이제 "m 0"을 시도 할 때 Scala는 유효한 연산자 (~,!, - 및 +)가 아닌 근거로 단독 연산자가됩니다. "m"은 유효한 객체라는 것을 알게됩니다. 그것은 메소드가 아니라 함수이며 모든 함수는 객체입니다.

"0"은 유효한 스칼라 식별자가 아니기 때문에 디픽이나 포스트 픽스 연산자가 아닐 수 없습니다. 따라서 Scala는 그것이 기대했다고 불평합니다. ";" - "M"과 "0"의 두 가지 유효한 표현을 분리합니다. 당신이 그것을 삽입 한 경우, m은 인수가 필요하다고 불평 할 것입니다.

다른 팁

나는 운영자 구문 스타일이 왼쪽에 명백한 객체가있을 때만 작동한다고 생각합니다. 구문은 자연스럽게 "피연산자 운영자 오페라"스타일 작업을 표현할 수 있도록 의도되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top