Scala学习(十一)操作符

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

1.中置操作符

你可以这样写

a 标识符 b

例如:

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

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

2.一元操作符

中置操作符是二元的,它有两个参数(一个显示参数一个隐式参数),只有一个操作符的参数称为一元操作符。如果它出现在参数之后,那么他就是一个后置操作符。例如:

a 标识符

又如:

1 toString 等同于 1.toString()

如下四个操作符+、-、!、~可以作为前置操作符,出现在参数之前。它们被转换成名为 unary_操作符 的方法调用。例如:

a 等同于 a.unary_-一样

3.赋值操作符

赋值名称的操作符名称形式为 操作符= 以下表达式:

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

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

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

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

4.优先级

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

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

image2018-10-9_12-41-24.png?version=1&modificationDate=1539060082068&api=v2

image2018-10-9_12-41-40.png?version=1&modificationDate=1539060097629&api=v2

出现在同一行字符所产生的操作符优先级相同。举例来说,+和→有着相同的优先级。

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

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与模式匹配器一起使用,效果奇佳。

转载于:https://my.oschina.net/u/3687664/blog/2236621

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值