你如何以现代方式定义隐式转换?

gre*_*man 1 scala implicit implicit-conversion

愚蠢的问题,但这些例子都不适合我; 经典文章" 皮条客我的图书馆 "是错误的,甚至最简单的代码也有问题.

顺便说一句.我假设您必须在对象中放置转换方法(很多片段都省略了该部分).根据PiS的书,似乎挂隐式def是可以的,但这也给了我错误.

object Minutes
{
  implicit def toMinutes(x : Int) = new Minutes(x)
}

class Minutes(private val x : Int)
{
  def minutes = x.toString+"m"
}

object MainApp {

  def main(args : Array[String])
  {
     println(5.minutes)
     ...
Run Code Online (Sandbox Code Playgroud)

错误 - "值分钟不是Int的成员".

我错过了什么?Scala 2.9.1.

agi*_*eel 9

您需要做的就是将隐式转换带到您想要使用它的范围内,以便编译器可以找到它...

def main(args : Array[String]) {
   import Minutes._
   println(5.minutes)
}
Run Code Online (Sandbox Code Playgroud)

  • @macias - 等等,什么?您是否在`object Minutes`中尝试`def foo = 5`然后尝试在`main`中使用`println(foo)`?仅仅因为你可以使用`Xy`得到一些东西并不意味着`y`在范围内.(这意味着`X`在范围内.) (5认同)
  • @macias - 每当你离开大括号时,这些大括号内定义的任何内容都超出了范围. (3认同)

Lan*_*dei 7

隐式转换必须在范围内,例如

def main(args : Array[String]) {
  import Minutes._
  println(5.minutes)
  ...
}
Run Code Online (Sandbox Code Playgroud)

还有其他方法,例如使用包对象.