scala语言中的scheme-cond

scala语言中的scheme-cond,scala,Scala,scala是否具有与scheme的cond等效的值?我猜您正在寻找匹配(或者仅仅是if/else if/else) 它与变量模式匹配一样,匹配任何对象,但不将匹配的对象绑定到变量 顶部的case类是Scala,它是创建提取器和类本身的简写。当然,匹配和如果做的事情与cond完全相同。一种可能是这样做: object Cond { def apply(clauses: Iterable[(()=>Boolean, ()=>Any)]): Any = { clauses fi

scala是否具有与scheme的cond等效的值?

我猜您正在寻找
匹配
(或者仅仅是
if/else if/else

它与变量模式匹配一样,匹配任何对象,但不将匹配的对象绑定到变量


顶部的case类是Scala,它是创建提取器和类本身的简写。

当然,
匹配
如果
做的事情与
cond
完全相同。一种可能是这样做:

object Cond {
  def apply(clauses: Iterable[(()=>Boolean, ()=>Any)]): Any = {
    clauses find (_._1()) map (_._2()) getOrElse ()
  }
}
此对象接受Iterable,其中每个项是一对返回布尔值的函数和一对返回任意值的函数。它尝试查找第一个函数返回true的项,如果找到,则停止查找,对找到的项调用第二个函数,并返回该函数的结果(如果没有找到,则返回()

示例:

val clauses = Seq(
  ({()=>false}, {()=>println("foo")}),
  ({()=>true}, {()=>println("bar")})
)
Cond(clauses)

def checkYear(year: Int) = {
  Cond(Seq(
    ({()=>year % 400 == 0}, {()=>42}),
    ({()=>true}, {()=>{c:Char => (c.toString * 3)}})
  ))
}

埃塔:是的,我知道它很难看,但它很管用。

最直接的翻译是使用图案保护,尽管它需要一些样板。模式保护仅在
案例
模式中起作用,
案例
仅在
匹配
中起作用(除非我们编写的是
部分函数

我们可以通过
匹配
将一个单位值与平凡的
情况
匹配来满足这些条件:

;; Scheme
(cond
  (foo bar)
  (baz quux)
  (t   mydefault))

// Scala
() match {
  case _ if foo => bar
  case _ if baz => quux
  case _        => mydefault
}
val clauses = Seq(
  ({()=>false}, {()=>println("foo")}),
  ({()=>true}, {()=>println("bar")})
)
Cond(clauses)

def checkYear(year: Int) = {
  Cond(Seq(
    ({()=>year % 400 == 0}, {()=>42}),
    ({()=>true}, {()=>{c:Char => (c.toString * 3)}})
  ))
}
;; Scheme
(cond
  (foo bar)
  (baz quux)
  (t   mydefault))

// Scala
() match {
  case _ if foo => bar
  case _ if baz => quux
  case _        => mydefault
}