クラス定義:
val
またはvar
、パラメーターをプライベートにするクラスパラメーターから省略できます。
varまたはvalを追加すると、パブリックになります(つまり、メソッドアクセサーとミューテーターが生成されます)。
{}
クラスにボディがない場合、つまり、
class EmptyClass
クラスのインスタンス化:
コンパイラが推測できる場合は、ジェネリックパラメータを省略できます。ただし、タイプが一致しない場合、タイプパラメータは常に一致するように推測されます。したがって、タイプを指定しないと、期待どおりの結果が得られない可能性があります。つまり、
class D[T](val x:T, val y:T);
これにより、タイプエラーが発生します(Intが見つかりました、予期された文字列)
var zz = new D[String]("Hi1", 1) // type error
これは正常に動作しますが、
var z = new D("Hi1", 1)
== D{def x: Any; def y: Any}
型パラメーターTは、2つの中で最も一般的なスーパータイプであるAnyです。
関数の定義:
=
関数がUnit(nothing)を返す場合は削除できます。
{}
関数本体が削除できるのは、関数が単一のステートメントである場合ですが、ステートメントが値を返す場合(=
符号が必要)、つまり、
def returnAString = "Hi!"
しかし、これは動作しません:
def returnAString "Hi!" // Compile error - '=' expected but string literal found."
関数の戻り値の型は、推測できる場合は省略できます(再帰メソッドには戻り値の型を指定する必要があります)。
()
関数が引数を取らない場合、つまり、
def endOfString {
return "myDog".substring(2,1)
}
慣例により、副作用のないメソッド用に予約されています-詳細は後で説明します。
()
名前によるパスを定義するときに、それ自体は実際には削除されませんが、実際には意味的にまったく異なる表記法です。つまり、
def myOp(passByNameString: => String)
myOpが名前渡しのパラメーターを受け取り、その結果、関数パラメーターとは対照的に、文字列(つまり、文字列を返すコードブロックである場合があります)になると言います。
def myOp(functionParam: () => String)
これはmyOp
、ゼロのパラメーターを持つ関数を取り、文字列を返すことを示しています。
(注意してください、名前渡しパラメーターは関数にコンパイルされます。それは構文をより良くするだけです。)
()
関数が引数を1つだけ取る場合は、関数パラメータ定義で削除できます。次に例を示します。
def myOp2(passByNameString:(Int) => String) { .. } // - You can drop the ()
def myOp2(passByNameString:Int => String) { .. }
ただし、複数の引数を取る場合は、()を含める必要があります。
def myOp2(passByNameString:(Int, String) => String) { .. }
ステートメント:
.
ドロップして演算子表記を使用できます。演算子表記は、中置演算子(引数を取るメソッドの演算子)にのみ使用できます。詳細については、ダニエルの回答を参照してください。
.
postfix関数リストの末尾にもドロップできます
()
postfix演算子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、戻り値の型の削除を多用すると、コードを再利用するのに害を及ぼす可能性があります。コードに明示的な情報がないために、可読性が低下する例として仕様をご覧ください。変数のタイプが実際に何であるかを理解するための間接参照のレベルの数は、ナットになる可能性があります。うまくいけば、より良いツールがこの問題を回避し、コードを簡潔に保つことができます。
(わかりました。より完全で簡潔な回答をまとめるために(何かを見落としたり、何か間違い/不正確だったりしたらコメントしてください)、回答の最初に追加しました。これは言語ではないことに注意してください仕様なので、私はそれを学問的に正確にしようとはしていません-ちょうど参照カードのように。)