Отбрасывание ценностей - что такое лучшая практика в 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 несколько уникален тем, что это несколько самоуверенный язык, который также пытается интегрироваться с другим, не столь самоуверенным языком. Это приводит к болевым точкам. Есть разные философии, чтобы иметь дело с этим, но я склонен не потеть, а просто осознавать и пытаться изолировать границы.