Scala中忽略变量语法的用例是什么?

sam*_*est 9 scala

根据这个答案/sf/answers/560074581/我们可以在Scala中执行此操作:

val _ = 5
Run Code Online (Sandbox Code Playgroud)

现在我理解了lambda表达式中被忽略的参数的意义,但是我无法想象我想要声明一个根据定义我无法引用的变量的例子.我能想到的唯一例子是关于命名隐式值的懒惰,例如

implicit val _: MyNumeric = ...
...
class A[T : MyNumeric] {
...
Run Code Online (Sandbox Code Playgroud)

这是唯一的用例吗?我错过了什么吗?

如果它是唯一使用的情况下,不应该编译器/ IDE给予警告/提示时,val不是隐含的,因为它是毫无意义?

澄清

通过变量/值我的意思是单个,而不是提取声明的一部分.

Rég*_*les 16

我不认为这是一个功能.在任何情况下,它都不是"被忽略的变量".我的意思是,如果val _ = 5真的引入了一个未命名的值,那么你可以在同一个范围内声明任意多个.不是这样的:

scala> object Test {
     |   val _ = 5
     |   val _ = 7
     | }
<console>:9: error: _ is already defined as value _
         val _ = 7
         ^
Run Code Online (Sandbox Code Playgroud)

从错误消息中可以清楚地看到,真正发生的是实际命名的值_ (我称之为应该修复的编译器的怪癖).我们可以验证这个:

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

scala> Test.test()
5
Run Code Online (Sandbox Code Playgroud)

至于可能使用防止值丢弃警告(如som-snytt的回答所示),我更喜欢简单地返回一个明确的Unit.这看起来不那么复杂,甚至更短:

def g(): Unit = { f(); () }
Run Code Online (Sandbox Code Playgroud)

而不是:

def g(): Unit = { val _ = f() }    
Run Code Online (Sandbox Code Playgroud)


som*_*ytt 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> 
Run Code Online (Sandbox Code Playgroud)

为了验证,它也没有警告-Ywarn-unused.

  • 赋值始终在Scala中评估为"Unit".如果使用`val foo`而不是`val _`,你会得到完全相同的结果,不是吗? (2认同)
  • @JörgWMittag该块仍然在结尾处插入单元值作为结果表达式,但是通过赋值,您不会丢弃值; 使用下划线,你没有绞尽脑汁发明一个标识符.将此称为用例的延伸. (2认同)

Sea*_*ira 6

另一个用例(我能想到)与提取相关(在链接答案 "通配符模式"下调用):

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"
Run Code Online (Sandbox Code Playgroud)