编辑
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