What are all the uses of an underscore in Scala?
我看了一下scala-lang.org上的调查列表,发现了一个奇怪的问题:"你能说出"的所有用法吗?你能吗?如果是,请在这里这样做。请举例说明。
我能想到的是
存在主义类型1 |
更高类型参数
忽略的变量
1 |
忽略的参数
1 | List(1, 2, 3) foreach { _ => println("Hi") } |
忽略自身类型的名称
1 |
通配符模式
插值中的通配符模式
模式中的序列通配符
通配符导入
1 |
隐藏进口
1 |
将信件加入操作员
1 |
分配运算符
1 |
占位符语法
1 | List(1, 2, 3) map (_ + 2) |
方法值
1 | List(1, 2, 3) foreach println _ |
将按名称的调用参数转换为函数
1 |
默认初始值设定项
1 |
我可能忘记了其他人!
举例说明为什么
此示例来自0_uuuu:
1 2 3 4 5 6 7 8 |
在第一种情况下,
在第二种情况下,
这可能是我遇到过的斯卡拉最棘手的问题。
请注意,此示例在2.13中编译。忽略它,就像它被分配给下划线一样。
从常见问题解答中(我的条目),我当然不能保证是完整的(我在两天前添加了两个条目):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import scala._ // Wild card -- all of Scala is imported import scala.{ Predef => _, _ } // Exception, everything except Predef def f[M[_]] // Higher kinded type parameter def f(m: M[_]) // Existential type _ + _ // Anonymous function placeholder parameter m _ // Eta expansion of method into method value m(_) // Partial function application _ => 5 // Discarded parameter case _ => // Wild card pattern -- matches anything val (a, _) = (1, 2) // same thing for (_ <- 1 to 10) // same thing f(xs: _*) // Sequence xs is passed as multiple parameters to f(ys: T*) case Seq(xs @ _*) // Identifier xs is bound to the whole matched sequence var i: Int = _ // Initialization to the default value def abc_<>! // An underscore must separate alphanumerics from symbols on identifiers t._2 // Part of a method name, such as tuple getters 1_000_000 // Numeric literal separator (Scala 2.13+) |
这也是这个问题的一部分。
对下划线的用法的一个很好的解释是scala uuuuu[下划线]魔力。
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def matchTest(x: Int): String = x match { case 1 =>"one" case 2 =>"two" case _ =>"anything other than one and two" } expr match { case List(1,_,_) =>" a list with three element and the first element is 1" case List(_*) =>" a list with zero or more elements" case Map[_,_] =>" matches a map with any key type and any value type" case _ => } List(1,2,3,4,5).foreach(print(_)) // Doing the same without underscore: List(1,2,3,4,5).foreach( a => print(a)) |
在斯卡拉中,EDCOX1×0在导入包时与Java中的EDCOX1(1)类似。
1 2 3 4 5 6 7 8 9 10 11 | // Imports all the classes in the package matching import scala.util.matching._ // Imports all the members of the object Fun (static import in Java). import com.test.Fun._ // Imports all the members of the object Fun but renames Foo to Bar import com.test.Fun.{ Foo => Bar , _ } // Imports all the members except Foo. To exclude a member rename it to _ import com.test.Fun.{ Foo => _ , _ } |
在scala中,将为对象中的所有非私有var隐式定义getter和setter。getter名称与变量名相同,setter名称增加了
用途:
如果您试图将一个函数赋给一个新的变量,该函数将被调用,结果将被赋给该变量。这种混淆是由于方法调用的可选大括号造成的。我们应该在函数名后使用u将其分配给另一个变量。
有一个用法我可以看到这里的每个人似乎都忘了列出…
而不是这样做:
1 | List("foo","bar","baz").map(n => n.toUpperCase()) |
您可以简单地执行以下操作:
1 | List("foo","bar","baz").map(_.toUpperCase()) |
以下是使用
1 2 3 4 5 6 7 8 9 | val nums = List(1,2,3,4,5,6,7,8,9,10) nums filter (_ % 2 == 0) nums reduce (_ + _) nums.exists(_ > 5) nums.takeWhile(_ < 8) |
在上述所有示例中,一个下划线表示列表中的一个元素(对于reduce,第一个下划线表示累加器)
除了杰罗提到的用法外,我还喜欢这个:
1 2 3 | def getConnectionProps = { ( Config.getHost, Config.getPort, Config.getSommElse, Config.getSommElsePartTwo ) } |
如果有人需要所有连接属性,他可以执行以下操作:
1 |
如果只需要主机和端口,可以执行以下操作:
1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import scala._ // Wild card -- all of Scala is imported import scala.{ Predef => _, _ } // Exclusion, everything except Predef def f[M[_]] // Higher kinded type parameter def f(m: M[_]) // Existential type _ + _ // Anonymous function placeholder parameter m _ // Eta expansion of method into method value m(_) // Partial function application _ => 5 // Discarded parameter case _ => // Wild card pattern -- matches anything f(xs: _*) // Sequence xs is passed as multiple parameters to f(ys: T*) case Seq(xs @ _*) // Identifier xs is bound to the whole matched sequence Please check the below link for more details [https://docs.scala-lang.org/tutorials/FAQ/finding-symbols.html][1] |
有一个特定的例子可以用"uu"来表示:
1 2 3 |
可能等于:
1 |
在某些情况下应用"u"将自动转换为"(x$n)=>x$n"