我怎样才能消除这个点?我正在测试隐式转换

时间:2013-05-15 01:25:53

标签: scala implicit-conversion

我一直在尝试使用Int这样的类型:10 twotimes

类似于Akka的持续时间包,允许编写例如10 minutes5 seconds

我做了以下事情:

object ImplicitConversion2 {
  class Test(val a:Int) {
    def threetimes = a * 3
  }

  implicit def IntToTest(e:Int) = new Test(e)

  5.threetimes                 //> res0: Int = 15
  10.threetimes                //> res1: Int = 30
  11.threetimes                //> res2: Int = 33
}

在这种情况下,我可以使用threetimes之类的10.threetimes,即10threetimes之间的点。我想消除Intthreetimes之间的点。

但如果我写5 threetimes,则会发生错误。 我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

您指的是哪个版本的Scala?在版本2.10.1中,我收到功能警告,即我应该添加以下内容

import scala.language.implicitConversions

激活隐式转化。完成后,正如您所说,10.threetimes工作正常,但对10 threetimes我得到另一个功能警告,它告诉我添加:

import scala.language.postfixOps

启用后缀运算符。在这样做之后,一切正常。

编辑:以下是原始SIP(有待发现here)的摘录,其中列出了默认情况下不鼓励使用后缀运算符的原因(即,您会收到警告如果您使用它们;在以后的版本中,这可能会变成错误而不是警告):

  

postfixOps。仅在启用时,才允许使用后缀运算符表示法(expr op)。为什么保留这个功能?用Scala编写的几个DSL需要这个符号。为何控制它?后缀运算符与分号推断的交互性很差。大多数程序员因此而避免使用它们。

答案 1 :(得分:3)

正如Luigi Plinge在他的评论中正确指出的那样,编译器在调用后缀运算符作为参数后尝试使用该行。如果您查看错误消息,则会变得清晰:

<console>:10: error: Int does not take parameters
          3 threetimes

这个错误意味着,它试图使用某些东西作为参数,它不属于它。事实上,使用点符号修复此错误应该使其显而易见,出错。安全使用后缀运算符的唯一方法是将它们作为参数传递,其中),终止表达式。

def foo(x: Int, y: Int) = x + y

foo(4 threetimes, 8 threetimes)