문제
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은 인수가 필요하다고 불평 할 것입니다.
다른 팁
나는 운영자 구문 스타일이 왼쪽에 명백한 객체가있을 때만 작동한다고 생각합니다. 구문은 자연스럽게 "피연산자 운영자 오페라"스타일 작업을 표현할 수 있도록 의도되었습니다.
제휴하지 않습니다 StackOverflow