斯卡拉是否有一個相當於計劃的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. Scheme:About cond
- 4. let cond
- 5. count(*)其中cond = val或count(cond = val)
- 6. 的MongoDB $ COND
- 7. MongoDB $ cond問題
- 8. Clojure-New Cond Macro?
- 9. 使用COND
- 10. 重寫COND
- 11. 聚合$ COND用Java
- 12. Doxygen \ cond不工作
- 13. MongoDB使用$ last $ cond
- 14. JavaScript中的(cond && value || default_value)和(cond?value:default_value)之間是否有區別?
- 15. if(!cond(it.next()))代表`cond`是什麼意思?
- 16. WHERE <Cond> OR <Cond>但不能同時
- 17. 用lpeg轉換(cond,then,else)到ifthnel(cond,then,else)
- 18. SUM(IF(COND,EXPR,NULL))和IF(COND,SUM(EXPR),NULL)
- 19. 方案與方案大綱
- 20. 流方案 - 通過方案
- 21. rmongodb $ cond在彙總框架
- 22. cond->具有多個值
- 23. 貓鼬$ COND不工作
- 24. 來自cond的返回值
- 25. cond與本地綁定
- 26. Cond和Case有何區別?
- 27. $ COND操作Java代碼
- 28. 與cond匹配類型
- 29. if和cond的區別?
- 30. 「cond」,「and」和「or」in Scheme