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.)是的,有一个区别,第一个 ifif闭包内的正常语句传递给 for-comprehension。第二个是真正的后卫。它实际上会withFilter在调用之前调用范围foreach。所以这两件事的翻译会是这样的:

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

要添加更多上下文,调用withFilter甚至只是filter代替使用普通的 if 语句有一些好处。在 for comprehension 中,您可以对 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

在类似 in 的类型签名中,someFunction(i: (A) => Int)它意味着i属于 type Function1[A,Int],读作“function from Ato Int”。

于 2012-09-12T17:59:09.570 回答