클래스 정의 :
val
또는 var
매개 변수를 비공개로 만드는 클래스 매개 변수에서 생략 할 수 있습니다.
var 또는 val을 추가하면 public이됩니다 (즉, 메서드 접근 자와 뮤 테이터가 생성됨).
{}
클래스에 본문이없는 경우 생략 할 수 있습니다.
class EmptyClass
클래스 인스턴스화 :
일반 매개 변수는 컴파일러에서 유추 할 수있는 경우 생략 할 수 있습니다. 그러나 유형이 일치하지 않으면 항상 일치하도록 유형 매개 변수가 유추됩니다. 따라서 유형을 지정하지 않으면 예상 한 결과를 얻지 못할 수 있습니다. 즉,
class D[T](val x:T, val y:T);
그러면 유형 오류가 발생합니다 (Int found, expected String).
var zz = new D[String]("Hi1", 1) // type error
이것이 잘 작동하는 반면 :
var z = new D("Hi1", 1)
== D{def x: Any; def y: Any}
유형 매개 변수 T는 둘 중 가장 덜 일반적인 상위 유형 인 Any로 추론되기 때문입니다.
기능 정의 :
=
함수가 단위 (아무것도)를 반환하면 삭제할 수 있습니다.
{}
함수가 단일 문인 경우 함수 본문을 삭제할 수 있지만 문이 값을 반환하는 경우에만 ( =
부호 가 필요함 ), 즉,
def returnAString = "Hi!"
그러나 이것은 작동하지 않습니다.
def returnAString "Hi!" // Compile error - '=' expected but string literal found."
함수의 반환 유형은 유추 할 수있는 경우 생략 할 수 있습니다 (재귀 메서드에는 반환 유형이 지정되어 있어야 함).
()
함수가 인수를받지 않으면 삭제할 수 있습니다.
def endOfString {
return "myDog".substring(2,1)
}
관례 상 부작용이없는 메서드를 위해 예약되어 있습니다.
()
이름 paramenter 로 패스를 정의 할 때 실제로 삭제되지는 않지만 실제로는 의미 상 상당히 다른 표기법입니다. 즉,
def myOp(passByNameString: => String)
myOp가 pass-by-name 매개 변수를 취하여 함수 매개 변수와 반대로 문자열 (즉, 문자열을 리턴하는 코드 블록이 될 수 있음)을 생성한다고 말합니다.
def myOp(functionParam: () => String)
myOp
매개 변수가없는 함수를 취하고 문자열을 반환 한다고 말합니다 .
(이름에 의한 전달 매개 변수는 함수로 컴파일됩니다. 단지 구문을 더 멋지게 만듭니다.)
()
함수가 하나의 인수 만 사용하는 경우 함수 매개 변수 정의에서 삭제할 수 있습니다. 예를 들면 다음과 같습니다.
def myOp2(passByNameString:(Int) => String) { .. } // - You can drop the ()
def myOp2(passByNameString:Int => String) { .. }
그러나 둘 이상의 인수가 필요한 경우 ()를 포함해야합니다.
def myOp2(passByNameString:(Int, String) => String) { .. }
진술 :
.
중위 연산자 (인수를받는 메서드의 연산자) 에만 사용할 수있는 연산자 표기법을 사용하기 위해 삭제할 수 있습니다 . 자세한 내용은 Daniel의 답변 을 참조하십시오.
.
후위 함수 목록 꼬리에 대해 삭제할 수도 있습니다.
()
접미사 연산자 list.tail에 대해 삭제할 수 있습니다.
()
다음과 같이 정의 된 메소드와 함께 사용할 수 없습니다.
def aMethod = "hi!" // Missing () on method definition
aMethod // Works
aMethod() // Compile error when calling method
이 표기법은 List # tail과 같이 부작용이없는 메서드에 대한 규칙에 의해 예약되어 있기 때문입니다 (즉, 부작용이없는 함수의 호출은 함수가 반환 값을 제외하고 관찰 가능한 효과가 없음을 의미 함).
()
단일 인수를 전달할 때 연산자 표기법을 위해 삭제할 수 있습니다.
()
명령문 끝에없는 접미사 연산자를 사용해야 할 수 있습니다.
()
중첩 된 문, 익명 함수의 끝 또는 둘 이상의 매개 변수를 사용하는 연산자를 지정해야 할 수 있습니다.
함수를받는 함수를 호출 할 때 내부 함수 정의에서 ()를 생략 할 수 없습니다. 예를 들면 다음과 같습니다.
def myOp3(paramFunc0:() => String) {
println(paramFunc0)
}
myOp3(() => "myop3") // Works
myOp3(=> "myop3") // Doesn't work
이름 별 매개 변수를 사용하는 함수를 호출 할 때 인수를 매개 변수없는 익명 함수로 지정할 수 없습니다. 예를 들면 다음과 같습니다.
def myOp2(passByNameString:Int => String) {
println(passByNameString)
}
다음과 같이 호출해야합니다.
myOp("myop3")
또는
myOp({
val source = sourceProvider.source
val p = myObject.findNameFromSource(source)
p
})
하지만:
myOp(() => "myop3") // Doesn't work
IMO, 반환 유형 삭제의 남용은 코드 재사용에 해로울 수 있습니다. 코드에 명시적인 정보가 없기 때문에 가독성이 떨어지는 좋은 예는 사양을 참조하십시오. 변수의 유형이 무엇인지 실제로 파악하기위한 간접 수준의 수는 엉터리 일 수 있습니다. 더 나은 도구가이 문제를 피하고 코드를 간결하게 유지할 수 있기를 바랍니다.
(좋아요, 더 완전하고 간결한 답변을 모으기위한 탐구에서 (누락 한 것이 있거나 잘못된 것이 있거나 부정확 한 것을 코멘트하십시오), 저는 답변의 시작 부분에 추가했습니다. 이것은 언어가 아닙니다. 사양, 그래서 나는 정확히 학문적으로 정확하게 만들려고 노력하지 않습니다-단지 참조 카드처럼.)