斯卡拉是否有一個相當於計劃的COND?方案COND
Q
方案COND
8
A
回答
2
我猜你正在尋找match
(或者只是if/else if/else
)。
2
case class Paired(x: Int, y: Int)
def foo(x: Any) = x match {
case string : String => println("Got a string")
case num : Int if num < 100 => println("Number less than 100")
case Paired(x,y) => println("Got x and y: " + x + ", " + y)
case unknown => println("??: " + unknown)
}
前兩個case語句顯示基於類型的模式匹配。第三部分顯示了使用提取器將數據分解爲組成部分並將這些部分分配給變量。第三個顯示了可以匹配任何東西的可變模式匹配。未示出的是殼體_:
case _ => println("what")
其中相同的可變模式匹配,匹配任何東西,但是匹配的對象不結合的變量。
頂部的情況下,類是Scala中簡寫用於創建提取器以及類本身。
1
當然,match
和if
都不會與cond
完全相同。一種可能性是這樣做:
object Cond {
def apply(clauses: Iterable[(()=>Boolean,()=>Any)]): Any = {
clauses find (_._1()) map (_._2()) getOrElse()
}
}
這個對象接受的東西可迭代,其中每個項目是一對返回布爾和返回任何函數的函數。它試圖找到第一個函數返回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)}})
))
}
ETA:是的,我知道這是醜陋的,但它的工作原理。
相關問題
- 1. 方案:爲什麼在這裏需要使用cond?
- 2. mini-kanren cond-a cond-u和cond-e的區別是什麼?
- 3. let cond
- 4. count(*)其中cond = val或count(cond = val)
- 5. 重寫COND
- 6. MongoDB $ cond問題
- 7. MongoDB使用$ last $ cond
- 8. 聚合$ COND用Java
- 9. if(!cond(it.next()))代表`cond`是什麼意思?
- 10. SUM(IF(COND,EXPR,NULL))和IF(COND,SUM(EXPR),NULL)
- 11. 用lpeg轉換(cond,then,else)到ifthnel(cond,then,else)
- 12. 貓鼬$ COND不工作
- 13. 與cond匹配類型
- 14. cond與本地綁定
- 15. Mongoose SUM + $ cond +數組字段
- 16. 方案
- 17. 方案
- 18. 方案
- 19. 方案
- 20. 方案
- 21. 在方案中乘以方案
- 22. 延續方案
- 23. 方案遞歸
- 24. 設計方案
- 25. 刪除方案
- 26. 分片方案
- 27. 方案列表
- 28. 在方案
- 29. 在方案
- 30. 在方案