8

私は混乱しています。

ステートメントは値を返すため、すべてが式だと思いました。しかし、scala ではすべてがオブジェクトだということも聞きました。

それは実際には何ですか?scala が何らかの方法でそれを行うことを選択したのはなぜですか? それはscala開発者にとって何を意味するのでしょうか?

4

3 に答える 3

16

ステートメントは値を返すため、すべてが式だと思いました。

値を持たないものもありますが、ほとんどの場合、これは正しいです。つまり、Scala では基本的に「ステートメント」と「式」の区別をなくすことができます。

ただし、「値を返す」という用語は適切ではありません。すべてが値に「評価される」と言います。

しかし、scala ではすべてがオブジェクトだということも聞きました。

これは前のステートメントとまったく矛盾しません :) これは、すべての可能ながオブジェクトであることを意味します (したがって、すべての式がオブジェクトに評価されます)。ちなみに、関数は Scala の第一級市民としてオブジェクトでもあります。

scala が何らかの方法でそれを行うことを選択したのはなぜですか?

これは実際には、ステートメントと式が別個のものであり、すべてがオブジェクトであるとは限らない Java の方法の一般化であることに注意する必要があります。Java コードのすべての部分を多くの調整なしで Scala に変換できますが、その逆はできません。したがって、この設計上の決定により、簡潔さと表現力の点でScala は実際により強力になります。

それはscala開発者にとって何を意味するのでしょうか?

たとえば、次のことを意味します。

  • returnメソッドの最後の式として戻り値を配置できるため、多くの場合必要ありません。
  • ifandが式であるという事実を利用し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!"
          }
于 2012-04-05T03:56:40.060 に答える
8

ここでの違いは、「すべてが式である」というアサーションがコードのブロックについて行われているのに対し、「すべてがオブジェクトである」というアサーションはプログラム内の値について行われていることです。


コードのブロック

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にアクセスできますが、オブジェクトでもありませんTimeUnitTimeUnitそれは静的です(より良いフレーズが必要なため)。スカラで:

val j = 4
Map.empty

言語に関する限り、jはオブジェクト (それにメソッドをディスパッチすることもできMapます) であり、 type のモジュール (またはコンパニオン オブジェクト) ですscala.collection.immutable.Map

于 2012-04-05T13:34:22.240 に答える
6

すべてが scala の関数または式またはオブジェクトですか?

どれでもない。

物ではないものがあります。クラス、メソッドなど。

表現ではないものがあります。egclass Foo { }はステートメントであり、どの値にも評価されません。(基本的には上記と同じです。)

関数ではないものがあります。Scala コードにはたくさんの見所があるので、この例について言及する必要はありません。

つまり、「すべてが X である」というのは売り込みにすぎません (Scala の場合)。

于 2012-04-05T13:57:36.173 に答える