scala语言中的scheme-cond
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
匹配
(或者仅仅是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
}