15

我正在编写一个 DSL,其中“+”运算符是严格数字的,就像其他一些流行的语言一样。它很接近,但字符串“+”运算符搞乱了我的隐式转换。取消导入 String 类的运算符的语法是什么?

只是为了更清楚,而不是这样:

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

我想得到 x: Int = 5

我想我只需要两件事就能做到这一点:

  • 从字符串中删除(在我的范围内取消导入)“+”的定义
  • 定义 String 到 Int 的隐式转换

我被困在第一步。

谢谢

4

3 回答 3

9

根据Scala 规范的第 12.3.1 节,编译器对+方法进行String了特殊处理。我不确定,但是我认为这意味着您不能“取消导入”它,这很遗憾,因为它确实破坏了类型系统(很像相关toString方法)。

您能否为您的 DSL 中的操作员使用不同的名称,例如,++&

于 2010-04-18T23:26:46.393 回答
4

字符串的 + 方法是 String 类的方法(因此在每个字符串对象上),因此它不能被取消导入。

于 2010-04-19T04:04:29.123 回答
1

您不能取消导入它,但您可以使用 +: 并在 int 类上定义它。最好是这样写:“2”.toInt + 3。

于 2011-03-10T20:28:05.177 回答