2013-05-15 64 views
2

我一直試圖使用這樣的Int類型:10 twotimes如何消除此點?我正在測試隱式轉換

它類似於阿卡的持續時間包,它允許寫入例如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 
} 

在這種情況下,我可以使用threetimes10.threetimes,是與10threetimes之間的點。我想消除Intthreetimes之間的點。

但是,如果我寫5 threetimes,則會發生錯誤。 我該怎麼做?

+0

我的英文表達非常差,所以我想知道,現在我不必擔心,謝謝! chris – Notice

+0

沒問題。另一件事,也許在你的第一行中,你想用'threetimes'而不是'twotimes'?這不是什麼大不了的,只是說;) – chris

+0

是的,我想使用三次方法,它允許乘以3次,因爲我只是想測試它 – Notice

回答

3

您指的是哪個版本的Scala?隨着2.10.1版本,我得到一個功能警告,即我要補充以下

import scala.language.implicitConversions 

激活隱式轉換。這樣做,就像你說的後,10.threetimes工作正常,但10 threetimes我得到另一個功能警告告訴我補充:

import scala.language.postfixOps 

啓用後綴運算符。這樣做後,一切正常。

編輯:這裏是從原來的SIP的摘錄(被發現here),這也是爲什麼後綴運營商目前在默認情況下(即,你會如果你使用他們得到一個警告勸阻的理由;在以後的版本這可能會變成錯誤而不是警告):

postfixOps。只有在啓用的情況下,才允許使用後綴運算符符號(expr op)。爲什麼要保留該功能?用Scala編寫的幾個DSL需要符號。爲什麼控制它? Postfix運算符與分號推理交互很差。由於這個原因,大多數程序員都會避開它

+0

我正在使用scala 2.10.0版本,我會安裝它的新版本並測試它,謝謝克里斯! – Notice

+0

您是否嘗試過,我的上述解決方案是否適合您(使用您當前版本的Scala)? (我認爲它應該),即只需將上面提到的'import'添加到您的文件中即可。 – chris

3

正如Luigi Plinge在他的評論中正確地指出的那樣,編譯器會在調用postfix操作符後嘗試使用該行作爲參數。如果你看一下錯誤信息很清楚:

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

此錯誤意味着,它試圖使用的東西作爲參數,它不屬於。事實上,使用點符號修復這個錯誤應該很明顯,出了什麼問題。安全使用postfix操作符的唯一方法是將它們作爲參數傳遞,其中),終止表達式。

+0

我遇到了這個問題,謝謝你的建議! – Notice