Каковы варианты использования синтаксиса 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"