2010-04-18 43 views
13

我正在寫一個DSL,其中「+」運算符是嚴格數字的,就像其他一些流行的語言一樣。它很接近,但String「+」運算符正在搞亂我的隱式轉換。什麼是取消導入String類的運算符的語法?如何在Scala中導入String「+」運算符?

只是爲了更加明確,而不是這樣的:

 
scala> var x = "2" + 3; 
x: java.lang.String = 23 

我想獲得X:INT = 5

我想我只需要兩件事情要做到這一點:

  • 拆下(我的範圍之內unimport)的「+」從字符串定義
  • 定義字符串的一個隱式轉換爲Int

我卡上的第一步。

由於

+2

我想,「進口scala.Predef {any2stringadd => _}。」會的工作。 但它沒有。必須有我錯過的東西。 – Eastsun 2010-04-19 04:26:58

+2

'any2stringadd'用於左側不支持'+'運算符的地方,但右側是一個字符串。 (要看到這一點,運行'scala -Xprint:typer'並執行'new Object +「ZZZZZ」'')相比之下,''ZZZZZ'+ new Object'可以使用'String'上已經定義的+運算符,所以'any2stringadd'沒有被使用。 – 2010-04-19 14:17:04

回答

9

按照Scala spec的部分12.3.1中,String+方法具有由編譯器特殊處理。我不知道,但我認爲這意味着你不能「卸載」它,這是一個恥辱,因爲它真的打破了類型系統(很像有關toString方法)。

您可以在DSL中爲運營商使用不同的名稱,例如++&

+1

編譯器特別處理'+'方法的事實與它是否可以導入或未導入無關。該語言應該是非常寬的,並且在語義上將所有類方法視爲相同,無論它們是由編譯器合成還是由運行時庫提供。 – 2010-04-19 14:11:54

+0

我同意你的意思,如果'+'確實在'String'類中明確指定了,但是規範只是暗示了這一點,IMO可以解釋爲有一個隱式轉換編譯器,因此不能「unimported」)某種類型(例如'StringAdd'),它允許客戶端將'String'看作是用'+'方法定義的。我很高興在這裏被證明是錯誤的,但即使通過'String'(和'RichString')的運行時反射,我也找不到'+'(即'$ plus')方法。 – 2010-04-21 05:34:29

+1

謝謝,聽起來像是另一種「編譯器魔術」的例子,它實際上破壞了正交性,並與其他語言特性和庫有意想不到的交互。 – 2010-04-23 04:00:06

3

字符串的+方法是String類的方法(因此,每個字符串對象都是),因此它不能被unimported。

1

你不能unimport它,但你可以使用+:並定義它的int類。如果你把它寫這樣什麼是最好的:「2」 .toInt + 3

相關問題