Каковы варианты использования синтаксиса Ignored Variable в Scala?

Согласно этому ответу /questions/45024791/kakovo-vse-ispolzovanie-podcherkivaniya-v-scala/45024826#45024826 мы можем сделать это в Scala:

val _ = 5

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

implicit val _: MyNumeric = ...
...
class A[T : MyNumeric] {
...

Это единственный вариант использования? Я что-то пропустил?

Если это единственный вариант использования, не должен ли компилятор /IDE давать предупреждение / подсказку, когда val не является неявным, поскольку это совершенно бессмысленно?

осветление

Под переменной / значением я подразумеваю один, а не тот, который является частью объявления извлечения.

3 ответа

Решение

Он использует значение.

$ scala -Ywarn-value-discard
Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_11).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def f() = { println("I ran.") ; 42 }
f: ()Int

scala> def g(): Unit = { f() }
<console>:8: warning: discarded non-Unit value
       def g(): Unit = { f() }
                          ^
g: ()Unit

scala> def g(): Unit = { val _ = f() }
g: ()Unit

scala> g
I ran.

scala> 

Чтобы проверить, это также не предупреждает под -Ywarn-unused,

Я не думаю, что это вообще особенность. В любом случае, это не "игнорируемая переменная". Я имею в виду, что если val _ = 5 действительно ввел безымянное значение, тогда вы можете объявить столько, сколько хотите в одной и той же области видимости. Не так:

scala> object Test {
     |   val _ = 5
     |   val _ = 7
     | }
<console>:9: error: _ is already defined as value _
         val _ = 7
         ^

Из сообщения об ошибке ясно, что на самом деле происходит _ (который я назвал бы причудой компилятора, который должен быть исправлен). Мы можем проверить это:

scala> object Test {
     |   val _ = 5
     |   def test() { println( `_` ) } // This compiles fine
     | }
defined object Test

scala> Test.test()
5

Что касается возможного использования предотвращения предупреждения об отмене значения (как показано в ответе som-snytt), я предпочитаю просто возвращать явное Unit, Это выглядит менее запутанным и еще короче:

def g(): Unit = { f(); () }

в отличие от:

def g(): Unit = { val _ = f() }    

Другой вариант использования (который я могу придумать) связан с извлечением (и вызывается в разделе "Шаблоны подстановочных знаков" в связанном ответе):

val getCartesianPoint = () => (1, 2, 3)
// We don't care about the z axis, so we assign it to _
val (x, y, _) = getCartesianPoint()

val regex = "(.*?)|(.*?)|?.*".r
// Really, any unapply or unapplySeq example will do
val regex(_, secondValue) = "some|delimited|value|set"
Другие вопросы по тегам