如果我有match
表達式,我怎麼能讓它自動忽略不匹配而不是明確做case _ =>
?有沒有辦法創建一個這樣做的功能呢?有沒有辦法忽略不匹配的情況?
回答
您需要一種通用的方式來處理「忽略」。選項和其他類中提供了這個(除其他外)。所以,你可以:
val i = 7
Some(i) collect {
case 3 => "Yay!"
case 5 => "Boo!"
}
得到None
(類型爲Option[String]
)。所以基本上,如果您將x match
更改爲Some(x) collect
,您將獲得所需的功能。當你對處理選項感到滿意時,最好這樣做。
任何不能處理所有可能的輸入值的匹配塊都會形成一個部分函數,這是絕對可以在Scala中定義和使用的。
PartialFunction
是Function
的子類,並添加了isDefinedAt
方法,如果它與提供的值具有已定義的匹配,則返回true。部分函數最適用於測試定義的位置,例如捕獲塊或2.8集合API中的collect
方法。否則,如果您嘗試使用未定義爲輸入的值調用它,您將會收到異常。
寫一個通用的匹配:
object Match {
def default: PartialFunction[Any, Unit] = { case _ => }
def apply[T](x: T)(body: PartialFunction[T, Unit]) = (body orElse default)(x)
}
例子:
scala> 1 to 5 foreach (Match(_) {
| case 2 => println("two")
| case 3 => println("three")
| }
|)
two
three
您可能會感興趣太PartialFunction
的同伴對象的方法cond
和condOpt
。
感謝您的回覆。那麼對於'foreach'是否沒有任何類似'collect'類型函數的內建函數? – 2014-11-04 08:53:43
@MatthewSaltz沒有。 – 2014-11-05 18:43:37
- 1. 有沒有辦法比較字符串指針忽略他們的情況?
- 2. 有沒有辦法忽略忽略z-index的事件?
- 3. 有沒有辦法忽略INSERT上不存在的列?
- 4. 有沒有辦法在不使用JsonIgnore屬性的情況下忽略Json.NET中的只讀屬性?
- 5. 有沒有辦法忽略所有的xml解析異常?
- 6. 有沒有辦法讓一個MeshPhongMaterial忽略所有的燈
- 7. 使用Propel時有沒有辦法忽略現有的表格?
- 8. 有沒有辦法有條件地忽略Spring的JUnit測試?
- 9. 匹配具有正則表達式的字符串忽略的情況下
- 10. 有沒有辦法告訴Doxygen忽略(所有)命名空間?
- 11. SVN忽略情況
- 12. 有沒有辦法讓Firefox忽略無效的SSL證書?
- 13. 有沒有辦法忽略py.test中的test/conftest.py?
- 14. 有沒有辦法忽略Git的確切變化?
- 15. 有沒有辦法忽略2GB文件上傳的maxRequestLength限制?
- 16. 有沒有辦法忽略的應用程序資源contentpresenter
- 17. 有沒有辦法忽略git中的幾條線?
- 18. 有沒有辦法讓git忽略文件的某些行?
- 19. 有沒有辦法忽略java中的退格鍵?
- 20. 有沒有辦法忽略for循環中的計數器?
- 21. 有沒有辦法忽略水晶報表中的組DistinctCount
- 22. 有沒有辦法忽略Handlebars模板中的Handlebars模板?
- 23. 有沒有辦法忽略來自IRC客戶端的MOTD?
- 24. 有沒有辦法忽略XAML拋出的Visual Studio錯誤?
- 25. 有沒有辦法忽略Django中的Cache錯誤?
- 26. 有沒有辦法忽略dustJS模板中的標籤
- 27. 有沒有辦法在不使用組的情況下引用re.sub中的完整匹配表達式?
- 28. XmlDocument.Validate在沒有[XmlIgnore]的情況下忽略屬性
- 29. 有沒有辦法讓python str.partition忽略大小寫?
- 30. 有沒有辦法使用ack忽略文件路徑?
除了例外,我相信你也會在定義網站上發出警告,不是嗎? – Blaisorblade 2011-03-26 23:51:53