1

私は現在scalaを学んでいます。私はせっかちな人のために Scala を読んでいます。

1.)

警備員

違いはありますか?

for (i <- 0 to 10)if (i % 2 == 0) println(i)

for (i <- 0 to 10 if i % 2 == 0) println(i)

2.)

私はいつも次の記号を見ます=>が、それが何をするのか説明していません。

キャストだと思うこともあるけど、全然違うものだと思うので、解明していただければ幸いです。

4

1 に答える 1

5

1.) はい、違いがあります。最初ifに、クロージャー内の通常のステートメントを for-comprehension に渡します。2番目は実際の警備員です。を呼び出す前に、実際にwithFilter範囲を呼び出しforeachます。したがって、2 つのことを翻訳すると、次のようになります。

0.to(10).foreach(i => if(i % 2 == 0) println(i) )
0.to(10).withFilter(x => x % 2 == 0).foreach(i => println(i))

もう少しコンテキストを追加するには、通常の if ステートメントを使用する代わりにwithFilteror を呼び出すだけでもいくつかの利点があります。filterfor 内包表記では、map、flatmap、filter、collect などのネストされた呼び出しを使用できるため、ガードを追加すると、多くの af 呼び出しが実際に発生するのを防ぐことができます。例えば:

for {
  x <- 0 until 10
  y <- 10 until 20
} {
  if(x % 2 == 0) println(x*y)
}

実際の閉鎖を100回呼び出す

for {
  x <- 0 until 10
  if x % 2 == 0
  y <- 10 until 20
} println(x*y)

結果は同じままですが、これは50回しか呼び出されません。

2.)

=>関数/クロージャの引数リストを本体から分離します。

これcase e: NumberFormatException => Noneは部分関数の一部です。ここで=>、「引数」eが body から分離されNoneます。

のような型シグネチャでは、それが型でsomeFunction(i: (A) => Int)あることを意味します。iFunction1[A,Int]AInt

于 2012-09-12T17:59:09.570 に答える