Общедоступные методы Scala: ‘;’ ожидалось, но найден ‘def’

#scala #methods #compilation #function #public-method

#scala #методы #Сборник #функция #общедоступный метод

Вопрос:

Я написал этот метод:

 public def getXScaleFactor(panelWidth: Int): Double = {
  return (panelWidth / (samplesContainer[0].length.asInstanceOf[Double]))
}
  

и у меня проблемы с компиляцией:

 [error] ./src/main/scala/Controllers/TrackController.scala:85: ';' expected but 'def' found.
[error]   public def getXScaleFactor(panelWidth: Int): Double {
[error]          ^
  

Что не так в этом коде?

Ответ №1:

public это не зарезервированное слово в Scala, поэтому оно интерпретируется как имя переменной. По умолчанию используется общедоступный доступ; просто отключитесь public , и все будет в порядке.

Ответ №2:

Методы являются общедоступными по умолчанию. Удалить public .

Комментарии:

1. Спасибо! Я думал, что это необязательно, теперь я вижу, что это вообще не разрешено.

Ответ №3:

Просто в дополнение к ответам выше:

Вы также можете удалить return ключевое слово. Последний оператор / выражение в функции / методе автоматически является возвращаемым значением.

Ответ №4:

Проблема в том, что вы написали Java-код.

Кроме того, public вы также использовали [] для индексированного доступа к коллекции (что недопустимо) явный возвращаемый тип (который не нужен), return (который также не нужен) и .asInstanceOf (который не нужен и пахнет кодом)

Попробуйте это для упрощения и большей идиоматичности:

 def xScaleFactor(panelWidth: Int) =
  panelWidth / samplesContainer.head.length.toDouble
  

Или, если samplesContainer может быть пустым:

 def xScaleFactor(panelWidth: Int) =
  panelWidth / samplesContainer.headOption.map(_.length.toDouble).getOrElse(42.0)
  

Поместите туда все, что вы предпочитаете, вместо значения по умолчанию 42

Комментарии:

1. 1 за тщательную вычитку. В samplesContainer(0).length.toDouble этом нет ничего плохого, хотя, в зависимости от того, что samplesContainer такое — массив, я предполагаю, и я бы не назвал использование head для массива идиоматичным.

2. Поскольку я не указан, я бы неосторожно предположил, что здесь используется массив, и поэтому должен рассмотреть наиболее общую возможность для типа коллекции, доступного для индекса. Seq в данном случае.