2

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

它类似于 Akka 的 duration 包,它允许编写例如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
}

在这种情况下,我可以使用threetimeslike ,即在and10.threetimes之间加一个点。我想消除和之间的点。10threetimesIntthreetimes

但是如果我写5 threetimes,就会发生错误。我怎样才能做到这一点?

4

2 回答 2

3

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

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

这个错误意味着,它试图使用不属于它的东西作为参数。事实上,使用点符号修复这个错误应该很明显,出了什么问题。安全使用后缀运算符的唯一方法是将它们作为参数传递,其中 the)或 the,终止表达式。

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

foo(4 threetimes, 8 threetimes)
于 2013-05-15T06:54:48.870 回答
3

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

import scala.language.implicitConversions

激活隐式转换。这样做之后,正如你所说,10.threetimes工作正常,但10 threetimes我收到另一个功能警告,告诉我添加:

import scala.language.postfixOps

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

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

后缀操作。只有在启用的情况下,才允许使用后缀运算符表示法 (expr op)。为什么要保留这个功能?一些用 Scala 编写的 DSL 需要这种表示法。为什么要控制它?后缀运算符与分号推理的交互很差。大多数程序员出于这个原因避免使用它们。

于 2013-05-15T01:45:01.733 回答