根据这个答案https://stackoverflow.com/a/8001065/1586965,我们可以在Scala中执行此操作:
val _ = 5
现在我理解了lambda表达式中被忽略的参数的意义,但是我无法想象我想要声明一个根据定义我无法引用的变量的例子。我能想到的唯一例子是关于命名隐式值的懒惰,例如。
implicit val _: MyNumeric = ...
...
class A[T : MyNumeric] {
...
这是唯一的用例吗?我错过了什么吗?
如果它是唯一的用例,那么当val
不时,编译器/ IDE是否应该发出警告/提示,因为它完全没有意义?
澄清
通过变量/值,我的意思是单个,而不是提取声明的一部分。
答案 0 :(得分:16)
我根本不认为这是一个功能。在任何情况下,不"忽略变量"。
我的意思是,如果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() }
答案 1 :(得分:9)
它使用一个值。
$ 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
下发出警告。
答案 2 :(得分:6)
另一个用例(我能想到的)与提取有关(在&#34;通配符模式&#34;在the linked answer中调用):
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"