私は混乱しています。
ステートメントは値を返すため、すべてが式だと思いました。しかし、scala ではすべてがオブジェクトだということも聞きました。
それは実際には何ですか?scala が何らかの方法でそれを行うことを選択したのはなぜですか? それはscala開発者にとって何を意味するのでしょうか?
私は混乱しています。
ステートメントは値を返すため、すべてが式だと思いました。しかし、scala ではすべてがオブジェクトだということも聞きました。
それは実際には何ですか?scala が何らかの方法でそれを行うことを選択したのはなぜですか? それはscala開発者にとって何を意味するのでしょうか?
ステートメントは値を返すため、すべてが式だと思いました。
値を持たないものもありますが、ほとんどの場合、これは正しいです。つまり、Scala では基本的に「ステートメント」と「式」の区別をなくすことができます。
ただし、「値を返す」という用語は適切ではありません。すべてが値に「評価される」と言います。
しかし、scala ではすべてがオブジェクトだということも聞きました。
これは前のステートメントとまったく矛盾しません :) これは、すべての可能な値がオブジェクトであることを意味します (したがって、すべての式がオブジェクトに評価されます)。ちなみに、関数は Scala の第一級市民としてオブジェクトでもあります。
scala が何らかの方法でそれを行うことを選択したのはなぜですか?
これは実際には、ステートメントと式が別個のものであり、すべてがオブジェクトであるとは限らない Java の方法の一般化であることに注意する必要があります。Java コードのすべての部分を多くの調整なしで Scala に変換できますが、その逆はできません。したがって、この設計上の決定により、簡潔さと表現力の点でScala は実際により強力になります。
それはscala開発者にとって何を意味するのでしょうか?
たとえば、次のことを意味します。
return
メソッドの最後の式として戻り値を配置できるため、多くの場合必要ありません。if
andが式であるという事実を利用しcase
て、コードを短くすることができます例は次のとおりです。
def mymethod(x: Int) = if (x > 2) "yay!" else "too low!"
// ...
println(mymethod(10)) // => prints "yay!"
println(mymethod(0)) // => prints "too low!"
このような複合式の値を変数に割り当てることもできます。
val str = value match {
case Some(x) => "Result: " + x
case None => "Error!"
}
ここでの違いは、「すべてが式である」というアサーションがコードのブロックについて行われているのに対し、「すべてがオブジェクトである」というアサーションはプログラム内の値について行われていることです。
Java 言語には、式とステートメントの両方があります。つまり、コードの「ブロック」は式またはステートメントのいずれかです。
//the if-else-block is a statement whilst (x == 4) is an expression
if (x == 4) {
foo();
}
else {
bar();
}
式には型があります。ステートメントはそうではありません。ステートメントは、純粋にその副作用のために呼び出されます。
scala では、すべてのコード ブロックが式です。つまり、次のタイプがあります。
if (x == 4) foo else bar //has the type lub of foo and bar
これは非常に重要です。私はこれを十分に強調することはできません。式に値を割り当てることができるので、これは scala を扱うのが楽しい理由の 1 つです。
val x = if (x == 4) foo else bar
値とは、プログラムで参照する可能性のあるものを意味します。
int i = foo(); //i is a reference to a value
java.util.TimeUnit.SECONDS;
Java では、i
上記はオブジェクトではなく、プリミティブです。さらに、 のフィールドSECONDS
にアクセスできますが、オブジェクトでもありませんTimeUnit
。TimeUnit
それは静的です(より良いフレーズが必要なため)。スカラで:
val j = 4
Map.empty
言語に関する限り、j
はオブジェクト (それにメソッドをディスパッチすることもできMap
ます) であり、 type のモジュール (またはコンパニオン オブジェクト) ですscala.collection.immutable.Map
。
すべてが scala の関数または式またはオブジェクトですか?
どれでもない。
物ではないものがあります。クラス、メソッドなど。
表現ではないものがあります。egclass Foo { }
はステートメントであり、どの値にも評価されません。(基本的には上記と同じです。)
関数ではないものがあります。Scala コードにはたくさんの見所があるので、この例について言及する必要はありません。
つまり、「すべてが X である」というのは売り込みにすぎません (Scala の場合)。