我一直在尝试使用Int
这样的类型:10 twotimes
。
类似于Akka的持续时间包,允许编写例如10 minutes
和5 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
,即10
和threetimes
之间的点。我想消除Int
和threetimes
之间的点。
但如果我写5 threetimes
,则会发生错误。
我怎么能这样做?
答案 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)