如何在Scala中取消导出字符串"+"运算符?

Ale*_*x R 13 scala scala-2.8

我正在写一个DSL,其中"+"运算符是严格数字的,就像其他一些流行语言一样.它很接近,但String"+"运算符搞乱了我的隐式转换.unmporting String类的运算符的语法是什么?

为了更清楚,而不是这个:

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

我想得到x:Int = 5

我想我只需要做两件事就可以了:

  • 从Strings中删除(在我的范围内不引入)"+"的定义
  • 定义String到Int的隐式转换

我坚持第一步.

谢谢

Kri*_*ala 9

根据Scala规范的第12.3.1节,该+方法String由编译器进行特殊处理.我不确定,但我认为这意味着你不能"不安排"它,这是一个耻辱,因为它真的打破了类型系统(很像相关的toString方法).

您可以在DSL中为运营商使用不同的名称,例如,++&

  • `+` 方法是否被编译器特殊处理与是否可以导入或不导入无关。该语言应该是非常正交的,并且在语义上处理所有类方法,无论它们是由编译器合成还是由运行时库提供。 (2认同)
  • 谢谢,听起来像是“编译器魔法”的另一种情况,它实际上打破了正交性,并与其他语言功能和库发生了意想不到的交互。 (2认同)