kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 skaffman
skaffman
Вопрос

Как определить локальный var/val в первичном конструкторе в Scala?

В Scala первичный конструктор класса не имеет явного тела, а определяется неявно из тела класса. Как тогда отличить поля от локальных значений (т.е. значений, локальных для метода конструктора)?

Например, возьмем следующий фрагмент кода, представляющий собой модифицированную форму примера кода из "Программирования на Scala":

class R(n: Int, d: Int) {
   private val g = myfunc
   val x = n / g
   val y = d / g
}

Насколько я понимаю, это создаст класс с тремя полями: приватным "g" и публичными "x" и "y". Однако значение g используется только для вычисления полей x и y и не имеет никакого значения за пределами конструктора.

Итак, в этом (безусловно, искусственном) примере, как вы собираетесь определить локальные значения для этого конструктора?

60 2009-07-13T10:17:59+00:00 4
 giampaolo
giampaolo
Редактировал вопрос 17-го августа 2014 в 6:06
Программирование
scala
scala-primary-constructor
Решение / Ответ
Alexander Azarov
Alexander Azarov
13-го июля 2009 в 11:39
2009-07-13T11:39:20+00:00
Дополнительно
Источник
Редактировать
#9255867

Например.

class R(n: Int, d: Int) {
  val (x, y) = {
    val g = myfunc
    (n/g, d/g)
  }
}
37
0
Daniel  C. Sobral
Daniel C. Sobral
13-го июля 2009 в 12:19
2009-07-13T12:19:23+00:00
Дополнительно
Источник
Редактировать
#9255868

Есть несколько способов сделать это. Вы можете объявить такие временные переменные внутри частных определений, которые будут использоваться во время конструирования. Можно использовать временные переменные внутри блоков, возвращающих выражения (как в ответе Alaz'). Или, наконец, вы можете использовать такие переменные внутри альтернативных конструкторов.

По аналогии с альтернативными конструкторами, вы также можете определить их внутри метода "apply" объекта-компаньона.

Что вы не можете сделать, так это объявить поле "временным".

Заметьте также, что любой параметр, полученный первичным конструктором, также является полем. Если вы не хотите, чтобы такие параметры становились полями, и не хотите раскрывать фактические поля в конструкторе, обычным решением будет сделать первичный конструктор приватным, с фактическими полями, и использовать либо альтернативный конструктор, либо объект-компаньон apply() в качестве эффективного "первичного" конструктора.

16
0
Maxim Vladimirsky
Maxim Vladimirsky
28-го января 2010 в 7:46
2010-01-28T19:46:15+00:00
Дополнительно
Источник
Редактировать
#9255870

Другой вариант-сделать основной конструктор объекта частная и использовать компаньон объекта'ь применять метод в качестве строителя. Если мы применим (каламбур не предназначен) этот подход в вашем примере это будет выглядеть так:

class R private (val x: Int, val y: Int);

object R {
  def apply(n: Int, d: Int): R = {
    val g = myfunc;
    new R(n / g, d / g);
  }
}

Для создания экземпляра R вместо:

val r = new R(1, 2);

пишите:

val r = R(1, 2);

Это немного многословный, но могло быть и хуже, я думаю :). Позвольте's надеюсь, что частные[это] вальс будет рассматриваться как временные переменные в будущих выпусках Скала. Сам Мартин намекал, что.

Maxim Vladimirsky
Maxim Vladimirsky
Редактировал ответ 29-го января 2010 в 1:25
13
0
Pavel Feldman
Pavel Feldman
13-го июля 2009 в 10:44
2009-07-13T22:44:49+00:00
Дополнительно
Источник
Редактировать
#9255869

Некоторые дискуссии на эту тему, включая комментарии Martin Odersky'a, находятся здесь.

 Andrejs
Andrejs
Редактировал ответ 12-го августа 2013 в 10:41
6
0
Похожие сообщества 3
Scala User Group
Scala User Group
2 366 пользователей
[RU] Scala Chat. Не поленитесь открыть, особенно если вы новичок https://github.com/scala-russian/about/blob/master/README.md
Открыть telegram
Scala Jobs
Scala Jobs
2 084 пользователей
Чтобы попасть в наш канал вакансий, необходимо указать в описании вакансии компанию, стек и вилку Канал вакансий: @scala_jobs_feed Флуд: @jobs_voprosiki Основной чат: @scala_ru README: https://bit.ly/3lnPbIo По вопросам рекламы обращаться: @aleksei_t
Открыть telegram
Scala Learning & Education: Ask for Review & Noob questions
Scala Learning & Education: Ask for Review & Noob questions
1 199 пользователей
Сборник ресурсов для изучения https://github.com/Odomontois/LearnScala Вам обязательно помогут, если ваш вопрос будет сопровождаться кодом в https://scastie.scala-lang.org
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 1 день назад
2
Денис Васьков
Зарегистрирован 2 дня назад
3
Dima Patrushev
Зарегистрирован 5 дней назад
4
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
5
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией