簡體   English   中英

如何消除該點? 我正在測試隱式轉換

[英]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 threetimes10.threetimes ,即10threetimes之間的點。 我想消除Intthreetimes之間的點。

但是,如果我寫5 threetimes ,則會發生錯誤。 我怎樣才能做到這一點?

您指的是Scala的哪個版本? 在2.10.1版本中,我收到功能警告 ,即我應該添加以下內容

import scala.language.implicitConversions

激活隱式轉換。 這樣做之后,正如您所說, 10.threetimes可以正常工作,但是10 threetimes10 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM