为什么Scala会使用'_'运算符来导入软件包,而不是像Java中那样使用'*'?


17

在我看来,Scala的最大优点之一就是它与Java的互操作性以及类似的语法。我发现奇怪的一件事是使用_操作符进行包通配符导入,而不是*Java中使用的操作符。

有使用_代替的技术原因*吗?如果没有,那么为什么要进行此更改?


这可能只是功能上的事情。我知道Haskell在某些地方使用_充当通配符/未指定的值。
KChaloux

Answers:


36

在Scala中,*是有效的标识符。一个人可以这样写:

val * = "trollin'"
println(*)

结果是:

trollin'

可以编写一个*这样的类:

class * {
  def test():String = {
    "trollin'"
  }
}

因此,当我*在包中有一个类us.hexcoder并编写时:

import us.hexcoder.*

您可能要说的是,要导入名称为的类*。因此,Scala需要使用另一个符号来表示通配符导入。无论出于何种原因,他们决定使用_通配符。


9
问题变成了,为什么选择*作为有效的标识符,选择_作为通配符?
迈克·帕特里奇

2
即使我投票更多,这也是更正确的答案。以前从未听说过*作为标识符。
迈克尔·布朗

1
@MikeBrown在Lisp中也有效。这是Scheme中

18
@MikePatridge几乎可以肯定,因为Scala将其所有运算符都定义为函数,并允许开发人员以此定义自己的运算符。它不对运算符使用特殊情况的语法,因此*需要将其包括在内以进行乘法运算。因此,需要选择另一个不太常见的字符作为保留字符。
KChaloux

3
_字符类似于空格(如“填入空格”),因此,无论Scala是从其他地方借来的还是自己自己提出的,都可以将其用作通配符。
Michael Shaw 2013年

13

在函数式语言中,_字符通常用于表示“我不在乎此参数”或“此处可以执行任何操作”。将该值扩展到名称空间导入才有意义。


2

除了Glenn的答案外,它import还是Scala中任何地方的有效语句,您可以import将对象或实例成员纳入范围。由于*显然是许多类的成员,它不能被用来作为一个通配符import声明。因此,您最终得到的字符串必须不是有效的标识符。

_浮现在脑海。它在其他地方以不同含义使用的事实(现有类型,作为实例的功能)也是由于同一问题。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.