Чому Scala використовує оператор "_" для імпорту пакунків замість "*", як у Java?


17

На мою думку, однією з найбільших речей у Scala є її сумісність з Java та її подібний синтаксис. Одне, що мені здається дивним, - це використання _оператора для імпорту пакетів wilcard замість *оператора, який використовується на Java.

Чи є технічна причина використання _замість *? Якщо ні, то чому було зроблено цю зміну?


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

Відповіді:


36

У Scala *правильний ідентифікатор. Можна було написати:

val * = "trollin'"
println(*)

Отриманий результат:

trollin'

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

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

Тож саме так буває, коли я маю клас *в пакеті us.hexcoderі пишу:

import us.hexcoder.*

Ви б сказали, що хочете імпортувати клас із назвою *. Через це Scala потрібно було використовувати інший символ, щоб вказати імпорт підстановки. З будь-якої причини вони вирішили використовувати _як символ підстановки.


9
Тоді виникає питання, чому * було обрано як дійсний ідентифікатор, а _ як підстановку?
Майк Партрідж

2
Незважаючи на те, що в мене більше результатів, це правильніша відповідь. Ніколи раніше не чули про * як ідентифікатор.
Майкл Браун

1
@MikeBrown Це також дійсно в Lisp. Ось приклад у схемі

18
@MikePatridge Майже напевно, тому що Scala визначає всіх своїх операторів як функції, і дозволяє розробнику визначати власних операторів як таких. Він не робить синтаксис спеціального випадку для операторів, і його *потрібно включати для множення. Отже, іншого менш поширеного персонажа потрібно було обрати як зарезервованого персонажа.
KChaloux

3
Символ _ нагадує пробіл (як у "заповнити бланк"), тому незалежно від того, незалежно від того, чи Скала запозичила його десь із іншого чи придумала його самі, має сенс використовувати його як підстановку.
Майкл Шоу

13

У функціональних мовах символ _ зазвичай використовується, щоб сказати: "Мені це не хвилює цей параметр" або "Тут все може піти". Розширювати це значення на імпорт простору імен має лише сенс.


2

На додаток до відповіді Гленна, importце дійсне твердження в будь-якій точці Scala, і ви можете importоб'єкт або члени екземпляра в область дії. Оскільки *, очевидно, є членом багатьох класів, його не можна використовувати як маску для importвисловлювання. Таким чином, ви отримуєте рядок, який не повинен бути дійсним ідентифікатором.

_приходить на думку. Той факт, що він використовується в інших місцях для іншого значення (екзистенційний тип, функція як екземпляр), також пов'язаний з тим же питанням.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.