編輯
OK,@Drexin帶來了一個好點的重。Scala的隱式轉換的陷阱
如何處理不常見的轉換,與PreDef implicits衝突不會發生?例如,我正在與斯卡拉的JodaTime(偉大的項目!)合作。在我的implicits定義相同的控制器封裝的對象,我有一個類型別名:
type JodaTime = org.joda.time.DateTime
和隱含的意思轉換JodaTime龍(用於建立在ScalaQuery之上的DAL後者的日期存儲爲長)
implicit def joda2Long(d: JodaTime) = d.getMillis
此處PreDef和我的控制器包含義之間不存在歧義,並且控制器含義不會過濾到DAL中,因爲它位於不同的包範圍中。所以,當我做
dao.getHeadlines(articleType, Some(jodaDate))
隱式轉換爲長爲我做的,IMO,安全,並考慮到基於日期的查詢大量使用,我節省一些樣板。
同樣,對於str2Int轉換,控制器層接收Servlet URI參數爲String - > String。有很多情況下URI包含數字字符串,所以當我篩選一個路由以確定該字符串是否是Int時,我不希望每次都使用stringVal.toInt;相反,如果正則表達式通過,則讓隱式將字符串值轉換爲Int。大家聚在一起會是什麼樣子:
implicit def str2Int(s: String) = s.toInt
get("""/([0-9]+)""".r) {
show(captures(0)) // captures(0) is String
}
def show(id: Int) = {...}
在上述背景下,這些都是有效的用例隱式轉換,或者更,始終是明確的?如果是後者,那麼有什麼有效的隱式轉換用例?
ORIGINAL
在包對象我有一些隱式轉換中定義了一個簡單的字符串INT:
implicit def str2Int(s: String) = s.toInt
一般能正常工作,這需要一個Int PARAM方法,但接收一個字符串,將轉換爲Int,就像返回類型設置爲Int的方法一樣,但實際返回的值是一個String。
大,現在在某些情況下與可怕的曖昧隱式的編譯器錯誤:
兩個方法中類型的對象PREDEF augmentString(X:字串) scala.collection.immutable.StringOps和方法str2Int( S:字符串)詮釋 從java.lang.String中可能的轉換函數{VAL toInt:?}?
的情況下,我知道這是試圖做的時候發生的是手動聯字符串,TO- Int轉換。例如,val i = "10".toInt
我的解決方法/黑客一直在包對象的implicits一起創建asInt中幫手:def asInt(i: Int) = i
和作爲,asInt("10")
那麼,是隱含的最佳實踐隱(即通過獲取學習燒傷),還是有一些指引要遵循,以免陷入自己製造的陷阱?換句話說,是否應該避免簡單的常見隱式轉換,並且只能在要轉換的類型是唯一的情況下使用? (即永遠不會打歧義陷阱)
感謝您的反饋,implicits是真棒......當他們工作打算;-)
當您在範圍內進行隱式轉換時,爲什麼要調用''10「.toInt'?你應該使用''10':Int'來讓隱式轉換處理它。 (但我同意drexin關於這一般不是一個好的隱含的範圍。) – 2012-04-01 13:22:11
我不叫「10」.toInt,就是一個例子。我被咬的地方是新的JodaTime()。toString(「yyyy」)。toInt。我不知道重新:「10」:Int語法,很好知道。我編輯了我的答案以顯示使用隱含的上下文 – virtualeyes 2012-04-01 13:28:07
您的問題現在不包含問題。你可以嘗試再次編輯,說明你有什麼問題嗎? – 2012-04-01 13:39:09