关于隐式转换的问题

davepkxxx 2012-01-19

我在scala中写了一个

 

object StringUtils {

  implicit def rachString(s: String) = new {

    def substr(end: Int) = s.substring(0, end)

  }

}
 

 

如何让其他类可以使用这个新增的方法?

 

我试过几个都失败了,无法通过编译。

 

import StringUtils

 

 import StringUtils._
   
mwei 2012-01-19
-----------------------------------------------------------------
C:\Users\Root>scala
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) Client VM, Java
1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.

scala>object StringUtils {
|implicit def rachString(s: String) = new {
| def substr(end: Int) = s.substring(0, end)
|}
|}
defined module StringUtils

scala> import StringUtils._
import StringUtils._

scala> "abc".substr(1);
res0: java.lang.String = a

-----------------------------------------------------------------
scala> "abc".substr(1);
执行这一句的时候,由于String对象没有substr方法,Scala解释器就会到执行的上下文里找一个隐式函数,什么样的隐式函数呢,一个可以把String对象转换为带有substr方法的对象。
由于开始时已经导入了相关隐式函数(scala> import
StringUtils._),就能在上下文里找到这样一个隐式函数rachString,rachString负责把String对象转换为带有substr方法的匿名类对象;所以["abc".substr(1);]能被成功解释。
rachString函数不需要显示调用(如 yourObj.rachString(blah..)),否则怎对得起[隐式函数]这个名字?
--有段时间没看Scala了,望指正
---------------------------------------------------------------------
Global site tag (gtag.js) - Google Analytics