scala undercore(下划线)是怎么回事?
class sheet1 { var c:String =_通过jd编译,得到如下
public class sheet1 { private String c; public String c() { return this.c; } public void c_$eq(String x$1) { this.c = x$1; } }
发现下划线(_)在实际编译 位置中是x$1,x$1是形式参数,下划线就相当于一个匿名的实参,在這里占了一个位置给别人,当再次赋值的时候,就会改变实际值,也就是说“_”是用来过度的,第一个:1、默认初始化(val def不行)
就是这个匿名实参的初始值。
note: $后面跟数字是匿名类编译出来的 $后面跟文字是内部类编译出来的
下面就来看看scala中下划线的作用
1、默认初始化(val def不行)
var a:Int =_ //a: Int = 0 var b:Double =_ //b: Double = 0.0 var c:String =_ c: String = null var d:List[Int]=_ //d: List[Int] = null
def foo(l: List[Option[_]]) = ...3、Higher kinded type parameters(高阶类型参数)
case class A[K[_],T](a: K[T])
val _ = 5 val (a,_) = (5,2)</span>5、Ignored parameters(临时参数)
List(1, 2, 3) foreach { _ => println("Hi") }6、Wildcard patterns(通配模式)
Some(5) match { case Some(_) => println("Yes") }
import java.util._
import java.util.{ArrayList => _, _}
def bang_!(x: Int) = 5
def foo_=(x: Int) { ... }
List(1, 2, 3) map (_ + 2)
List(1, 2, 3) foreach println _13、parameters Sequence(参数序列)
//_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理。例如val s = sum(1 to 5:_*)就是将1 to 5当作参数序列处理。 //Range转换为List List(1 to 5:_*) //Range转换为Vector Vector(1 to 5: _*) //可变参数中 def capitalizeAll(args: String*) = { args.map { arg => arg.capitalize } }
val arr = Array("what's", "up", "doc?") capitalizeAll(arr: _*)Example showing why foo(_) and foo _ are different:
trait PlaceholderExample { def process[A](f: A => Unit) val set: Set[_ => Unit] set.foreach(process _) // Error set.foreach(process(_)) // No Error }分析:
参考文献
http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala