Отбрасывание ценностей - что такое лучшая практика в Scala?

WartRemover - х NonUnitStatements требует, чтобы операторы, которые не возвращали единицы, должны иметь присваивание. Хорошо, но иногда нам приходится использовать надоедливые API-интерфейсы Java, которые одновременно изменяют и возвращают значение, и на самом деле нас почти никогда не заботит возвращаемое значение.

Так что я в итоге пытаюсь это:

val _ = mutateSomething(foo)

Но если у меня есть несколько из них, _ на самом деле законный val, который был назначен, поэтому я не могу переназначить. Wartremover также справедливо будет предостерегать от необоснованного использования var, так что я не могу просто сделать var _ =,

Я могу сделать следующее (нужно ; чтобы не думать Скала, это определение продолжения, если я не добавляю полный перевод строки каждый раз, когда я делаю это).

;{val _ = mutateSomething(foo)}

Есть ли способ лучше?

2 ответа

Решение

Я публикую ответ, но реальная заслуга принадлежит Шейну Делмору за то, что он указал на это:

def discard(evaluateForSideEffectOnly: Any): Unit = {
  val _: Any = evaluateForSideEffectOnly
  () //Return unit to prevent warning due to discarding value
}

В качестве альтернативы (или см. Комментарии @som-snytt ниже):

@specialized def discard[A](evaluateForSideEffectOnly: A): Unit = {
  val _: A = evaluateForSideEffectOnly
  () //Return unit to prevent warning due to discarding value
}

Тогда используйте это как: discard{ badMutateFun(foo) },

в отличие от ;{ val _ = ... } Решение выглядит намного лучше, а также работает в начале блока без необходимости изменения стиля (; не может прийти в начале блока, он должен идти после оператора).

Мои общие мысли об инструментах для подкладки: вам не следует прыгать через обручи, чтобы их удовлетворить.

Суть в том, чтобы сделать ваш код лучше, с меньшим количеством ошибок и стилистически. Но просто присваивая var _ = не достигает этого. Сначала я был бы уверен, что мне действительно не важно возвращаемое значение, даже не утверждая, что это то, что я ожидаю. Если я этого не сделаю, я бы просто добавил @SuppressWarnings(Array("org.wartremover.warts.NonUnitStatements")) и, возможно, комментарий о том, почему и с этим покончено.

Scala несколько уникален тем, что это несколько самоуверенный язык, который также пытается интегрироваться с другим, не столь самоуверенным языком. Это приводит к болевым точкам. Есть разные философии, чтобы иметь дело с этим, но я склонен не потеть, а просто осознавать и пытаться изолировать границы.

Другие вопросы по тегам