在Scala中为yield关键字写一个类支持

时间:2017-08-22 05:59:14

标签: scala

如何在scala中创建课程支持for个关键字?
e.g:

class A(data: String) {
  ...
}

val a = A("I'm A")
for {
  data <- a
} yield {
  data
}

由于

1 个答案:

答案 0 :(得分:0)

编译器将所有for理解重写为必要的组成部分:map()flatMap()withFilter()foreach()。这就是为什么许多Scala语法规则在for理解中暂停的原因,例如无法以标准方式val x = 2创建变量,并且无法投入println()语句。

在您的示例中,这将有效。

class A(data: String) {
  def map[B](f: (String) => B) = f(data)
}

val a = new A("I'm A")
for {
  data <- a
} yield {
  data
}  // res0: String = I'm A

但请注意,如果您有多个生成器(<-是生成器),那么只有最后一个生成器会变成map()调用。以前的生成器都是flatMap()个调用。

如果您的for理解包含if条件,那么您也需要withFilter()

我建议避免for理解,直到你对他们的工作方式有一个良好的感觉。

相关问题