[英]How Can I eliminate this dot? I was testing Implicit Conversion
我一直試圖像這樣使用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
}
在這種情況下,我可以使用3 threetimes
如10.threetimes
,即10
到threetimes
之間的點。 我想消除Int
和threetimes
之間的點。
但是,如果我寫5 threetimes
,則會發生錯誤。 我怎樣才能做到這一點?
您指的是Scala的哪個版本? 在2.10.1版本中,我收到功能警告 ,即我應該添加以下內容
import scala.language.implicitConversions
激活隱式轉換。 這樣做之后,正如您所說, 10.threetimes
可以正常工作,但是10 threetimes
於10 threetimes
我會收到另一個功能警告 ,告訴我添加:
import scala.language.postfixOps
啟用后綴運算符。 這樣做之后,一切正常。
編輯:這是原始SIP的摘錄(可在此處找到),該摘錄提供了默認情況下現在不鼓勵使用postfix運算符的原因(即,如果使用它們,您將得到警告;在更高版本中,這可能會變成錯誤而不是警告):
postfixOps。 僅在啟用后,才允許使用后綴運算符(expr op)。 為什么要保留功能? 用Scala編寫的多個DSL需要該符號。 為什么要控制它? 后綴運算符與分號推理的交互性較差。 因此,大多數程序員都避免使用它們。
正如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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.