Почему Scala использует оператор '_' для импорта пакетов вместо '*', как в Java?

17

На мой взгляд, одной из самых замечательных особенностей Scala является его совместимость с Java и похожий синтаксис. Одна вещь, которая мне показалась странной, - это использование _оператора для импорта пакетов вместо *оператора, который используется в Java.

Есть ли техническая причина для использования _вместо *? Если нет, то почему это изменение было сделано?

vainolo
источник
Это может быть просто функциональная вещь. Я знаю, что Haskell использует _ в нескольких местах, чтобы действовать как подстановочный знак / не указанное значение.
KChaloux

Ответы:

36

В Scala *это действительный идентификатор. Можно написать:

val * = "trollin'"
println(*)

В результате получается:

trollin'

Можно написать класс, названный *так:

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

Так что в этом случае, когда у меня есть класс *в пакете, us.hexcoderи я пишу:

import us.hexcoder.*

Вы бы сказали, что хотите импортировать класс с именем *. Из-за этого Scala нужно было использовать другой символ для обозначения импорта по шаблону. По какой-то причине они решили использовать _в качестве символа подстановки.


источник
9
Тогда возникает вопрос, почему * был выбран в качестве действительного идентификатора, а _ в качестве подстановочного знака?
Майк Партридж
2
Хотя у меня больше голосов против, это более правильный ответ. Никогда не слышал о * как идентификатор раньше.
Майкл Браун
1
@MikeBrown Это также действует в Лиспе. Вот пример на схеме
18
@MikePatridge Почти наверняка, потому что Scala определяет все свои операторы как функции и позволяет разработчику определять свои собственные операторы как таковые. Он не использует особый синтаксис для операторов и *должен быть включен для умножения. Поэтому в качестве зарезервированного персонажа нужно было выбрать другого менее распространенного персонажа
KChaloux
3
Символ _ напоминает пробел (как в «Заполнить пробел»), поэтому независимо от того, позаимствовал ли он у Scala откуда-либо еще или придумал сам, имеет смысл использовать его в качестве подстановочного знака.
Майкл Шоу
13

В функциональных языках символ _ обычно используется, чтобы сказать: «Мне не важен этот параметр» или «Здесь все может пойти». Расширение этого значения до импорта пространства имен имеет смысл.

Майкл Браун
источник
2

В дополнение к ответу Гленна, importэто допустимое утверждение в любом месте Scala, и вы можете importвключить объект или экземпляр в область видимости. Поскольку *он, очевидно, является членом многих классов, его нельзя использовать в качестве подстановочного знака для importоператора. Таким образом, вы получите строку, которая не должна быть действительным идентификатором.

_приходит в голову. Тот факт, что он используется в других местах для другого значения (экзистенциальный тип, функция как экземпляр), также связан с той же проблемой.

Лео
источник
0

В Scala есть десятки мест, где используется подчеркивание. Использование его для импорта подстановочных знаков является просто логическим следствием.

kiritsuku
источник