Scala学习(十一)操做符

在Scala中,yield是一个保留字,但你可能须要访问Java中一个一样命名的方法。反引号来拯救你:Thread.`yield`()。数组

1.中置操做符

你能够这样写app

a 标识符 bspa

例如:scala

1 to 10  等同于 1.to(10)code

1 -> 10  等同于 1.->(10)orm

2.一元操做符

中置操做符是二元的,它有两个参数(一个显示参数一个隐式参数),只有一个操做符的参数称为一元操做符。若是它出如今参数以后,那么他就是一个后置操做符。例如:对象

a 标识符get

又如:input

1 toString 等同于 1.toString()it

以下四个操做符+、-、!、~能够做为前置操做符,出如今参数以前。它们被转换成名为 unary_操做符 的方法调用。例如:

a 等同于 a.unary_-同样

3.赋值操做符

赋值名称的操做符名称形式为 操做符= 如下表达式:

a 操做符= b 等同于 a = a 操做符 b 例如:

a += b 等同于 a = a + b

关于赋值操做符,有些细节要注意:

  • <=、>=和!=不是赋值操做符
  • 以=开头的操做符不是赋值操做符(==、===、=/=等)。
  • 若是a有一个名为操做符=的方法,那么该方法会被直接调用。

4.优先级

当你一次性使用两个或更多操做符,有没有给出括号的话,首先执行的是最好优先级的操做符。

除赋值操做外,优先级由操做符的首字符决定。

出如今同一行字符所产生的操做符优先级相同。举例来讲,+和→有着相同的优先级。

后置操做符的优先级低于中置操做符:

a 中置操做符 b 后置操做符

上述代码等同于:

(a 中置操做符 b) 后置操做符

5.结合性

当你有一系列相同优先级的操做符时,操做符的结合性决定了它们是从左到右求值仍是从右到左求值。

在Scala当中,全部操做符都是左结合的,除了:

  • 以冒号(:)结尾的操做符
  • 赋值操做符(=)

尤为值得一提的是,用于狗仔列表的::操做符时右结合的。例如:

1 :: 2 :: Nil  等同于 1 :: (2 :: Nil)

右结合的二元操做符是其第二个参数的方法。例如:

2 :: Nil 等同于 Nil.::(2)

注:Nil的做用是构造一个空的集合(List)

6.apply和update方法

以前咱们提到过的apply方法也是一种操做符。

update方法被用于数组和映射的赋值操做。

在数组或映射当中,apply方法至关于get,update方法至关于set。例如:

Array(100)              //Array.apply(100)

Array(100) = 200    //Array.apply(200)

7.提取器

所谓的提取器就是一个带有unapply方法的对象。你能够把unapply方法当作是伴生对象中apply的反向操做。

apply方法接收构造参数,而后将他们变成对象。而unapply方法接受一个对象,而后从中提取值。

咱们说apply和unapply互为反向。单着并非必须的,你能够用提取器从任何类型的对象中提取任何信息。

例如:

class Fraction(val n:Int, val d:Int){
}

object Fraction{
    def apply(n:Int, d:Int) = new Fraction(n, d)
    def unapply(f:Fraction) = Some(f.n, f.d);
}

apply调用:

val f = Fraction(1, 2)

unapply调用:

val Fraction(a,b) = f

输出:

a: Int = 1
b: Int = 2

8.待单个参数或无参数的提取器

在Scala中,并无只带一个组件的元组。若是unapply方法要提取单值,则她应该返回一个目标类型的Option。例如:

object Number{
    def unapply(input: String): Option[Int] = {
        try{
            Some(Integer.parseInt(input.trim))
        } catch{
            case ex: UnmberFormatException => None
        }
    }
}

9.unapplySeq方法

要提取任意长度的值得序列,咱们应该用unapplySeq来命名咱们的方法。它返回一个Option[Seq[A]],其中A是被提取的值得类型。例如:

object Name{
    def unapplySeq(input: String): Option[Seq[String]] = {
        if(inout.trim == "" ) None else Some(input.trim.split("\\s+"))
    }
}

说明:unapply和unapplySeq与模式匹配器一块儿使用,效果奇佳。

相关文章
相关标签/搜索