почему n = 5 - правильный синтаксис? [Scala] - PullRequest
0 голосов
/ 11 ноября 2018
object solution extends App {
  'n = 5
}

Это дает время компиляции Ошибка: обновление значения не является членом объекта Symbol println ('n =' n) , что понятно. Потому что литералы являются фиксированными значениями в исходном коде. Но с какой стати приведенный выше синтаксис действителен?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Причина, по которой синтаксис действителен, заключается в том, что… хорошо… потому что это:

implicit class UpdateableSymbol(val s: Symbol.type) extends AnyVal {
  def update[A](s: String, v: A) = println(s"`Symbol.update` called with s = $s and v = $v")
}

'n = 5
// `Symbol.update` called with s = n and v = 5

Как видите, в синтаксисе нет ничего плохого, так почему он должен быть недействительным? Сообщение об ошибке сообщает вам, в чем проблема: вы звоните Symbol.update, но этого не существует. Отсутствующий метод не является синтаксической ошибкой, это семантическая ошибка.

0 голосов
/ 11 ноября 2018
Welcome to Scala 2.12.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92).
Type in expressions for evaluation. Or try :help.

scala> import reflect.runtime.universe._
import reflect.runtime.universe._

scala> reify('n)
res0: reflect.runtime.universe.Expr[Symbol] = Expr[Symbol](Symbol.apply("n"))

scala> val a = 'n
a: Symbol = 'n

scala> a = 5
<console>:15: error: reassignment to val
       a = 5
         ^

scala> a.update(5)
<console>:16: error: value update is not a member of Symbol
       a.update(5)
         ^

Desugar это, и вы найдете ответ.

В Scala операторы - это методы.

Для символа см. https://github.com/scala/scala/blob/2.13.x/src/library/scala/Symbol.scala

...