Nano Hash - криптовалюты, майнинг, программирование

Как запустить класс значений scala в блокноте Jupyter

Я пытаюсь запустить следующий код в блокноте Jupyter:

trait Printable extends Any {
   def print(): Unit = println(this)
}

class Wrapper(val underlying: Int) extends AnyVal with Printable

object Demo {
   def main(args: Array[String]) {
      val w = new Wrapper(3)
      w.print() // actually requires instantiating a Wrapper instance
   }
}

Demo.main(Array())

Когда ячейка выполняется, появляется сообщение об ошибке:

Name: Compile Error
Message: <console>:15: error: value class may not be a member of another class
       class Wrapper(val underlying: Int) extends AnyVal with Printable
             ^
StackTrace:

Я полагаю, что это происходит из-за того, что Jupyter может запускать команду scala вместо команды scalac, и, по-видимому, scala заключает все в класс верхнего уровня, чтобы включить сценарии. Класс значения не может быть внутренним классом и, следовательно, причиной ошибки. Был связанный вопрос по этой теме:

Scala: как определить класс значений

Есть ли решение этой проблемы?

Я использую Apache Toree Scala с ноутбуком Jupyter.
ОС: OS X 10.11.6, Scala 2.11.8, Jupyter 4.3.0, Apache Toree 0.2.0.

Заранее спасибо!


Ответы:


1

Если вы измените свой класс Wrapper так, чтобы он больше не расширял AnyVal, то он больше не является «классом значения», и ваша проблема исчезнет. Но если вы сделаете это, вы больше не будете наследовать функцию печати от AnyVal, вместо этого получая ее от Any (Any является суперклассом всех классов, например Object в Java). Поэтому, чтобы сохранить ту же функциональность, вам придется переопределить функцию печати:

trait Printable extends Any {
   def print(): Unit = println(this)
}

class Wrapper(val underlying: Int) extends Printable {
  override def print(): Unit = println(underlying)
}

object Demo {
   def main(args: Array[String]) {
      val w = new Wrapper(3)
      w.print() // actually requires instantiating a Wrapper instance
   }
}

Demo.main(Array())
25.09.2017
  • Благодарю вас! Это решило мою проблему. Требуется ли синтаксис scala, чтобы человек использовал extends Printable вместо extensions AnyVal с Printable? Или это необходимо только в этом случае, потому что scala используется в среде ноутбука Jupyter? 26.09.2017
  • Рад это слышать. :-) Я отредактировал свой ответ, чтобы попытаться прояснить, почему это решает проблему. Если вы запутались с расширениями и с, посмотрите здесь: stackoverflow. com/questions/41031166/scala-extends-vs-with 27.09.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..