Definicja dosłownego literału punktowego w SCALA jest

floatingPointLiteral  ::=  digit {digit} ‘.’ digit {digit} [exponentPart] [floatType]
                        |  ‘.’ digit {digit} [exponentPart] [floatType]
                        |  digit {digit} exponentPart [floatType]
                        |  digit {digit} [exponentPart] floatType
exponentPart          ::=  (‘E’ | ‘e’) [‘+’ | ‘-’] digit {digit}
floatType             ::=  ‘F’ | ‘f’ | ‘D’ | ‘d’

Kiedy próbuję wprowadzić literał pływającego punktu, który zaczyna się od kropki, otrzymuję błąd:

scala> .123
        ^
   error: ';' expected but double literal found.

Jeśli przypisuje się tak dosłownie do pewnej zmiennej, wszystko jest w porządku

scala> val x = .123
x: Double = 0.123

Dlaczego tak się tak zachowuje?

2
Oleksii Leonov 11 październik 2020, 22:17

1 odpowiedź

Najlepsza odpowiedź

Prawdopodobnie wykorzystywany wklejony jest z Składnia Podsumowanie.

Zanim odpowiemy na twoje pytanie, zauważmy, zauważmy:

scala> 1.213
res1: Double = 1.213

Problem tutaj nie jest floating, ale fakt, że wyrażenie zaczyna się od kropki. Sprawia, że konsola, podobnie jak zwykły program SCALA, aby ocenić wyrażenie na ostatnim obiekcie obliczonym.

Zróbmy przykład:

scala> val d = 1.123
d: Double = 1.123

scala> .equals(1.123)
res10: Boolean = true

scala> .equals(1.123)
res11: Boolean = false

scala> .toString
res12: String = false

Jak widać, każda nowa linia, jest kontynuacją poprzedniego. Możesz wrócić na przykład:

scala> res10
res13: Boolean = true

Ale obiekt w pamięci podręcznej jest ostatnim wynikiem.

W swoim przykładzie, prawdopodobnie ostatni udany bieg konsoli był val x = .123, który umieścił ostatnią res jako Double. Kiedy pobiegłeś .123 zaczynasz inny BlockStat. Lexer identyfikuje to jest Block, a zatem oczekuje, że semi (który jest ;) między innym BlockStat s.

Podczas uruchamiania nowej konsoli działa zgodnie z oczekiwaniami:

scala> .123
res0: Double = 0.123
4
Tomer Shetah 12 październik 2020, 08:04