zoukankan      html  css  js  c++  java
  • Chapter11

    package scala

    import scala.collection.mutable

    /**
    * Created by EX-CHENZECHAO001 on 2018-04-03.
    */
    class Chapter11 {

    }
    object Chapter11 {

    // 标识符由字母、数字或运算符构成
    // 一元和二元操作符其实是方法调用
    // 操作符优先级取决于第一个字符,而结合性取决于最后一个字符
    // apply和update方法在对expr(args)表达式求值时被调用
    // 提取器从输入中提取元组或值的序列

    // 11.1 标识符
    // 变量、函数、类等的名称统称为标识符
    // 可以在反引号中包含几乎任何字符序列
    val `val` = 42

    // 11.2 中置操作符
    1 to 10
    1.to(10) // 等同
    1 -> 10
    1.->(10) // 等同

    // 11.3 一元操作符
    // 中置操作符是二元的,它们有两个参数。只有一个参数的操作符称为一元操作符。如果参数在后,则为后置操作符
    1 toString()
    1.toString() // 等同
    // + - ! ~ 可以作为前置(prefix)操作符,出现在参数之前。它们被转换成对名为unary_操作符的方法调用
    -1
    1.unary_- // 等同

    // 11.4 赋值操作符
    // 赋值操作符的名称形式为操作符=
    var a = 0
    var b = 1
    a -= b
    a = a - b // 等同
    // <= >= != 不是赋值操作符
    // 以=开头的操作符不是赋值操作符(== === =/=等)
    // 如果a有一个名为操作符=的方法,那么该方法会被直接调用

    // 11.5 优先级
    // 除赋值操作符外,优先级由操作符的首字符决定
    // 后置操作符的优先级低于中置操作符

    // 11.6 结合性
    // 操作符的结合性决定了它们是从左到右求值还是从右到左求值。
    // 在Scala中所有操作符都是左结合的,除了
    // 1.以冒号结尾的操作符
    // 2.赋值操作符
    // 3. 用户于构造列表的::操作符是右结合的,1 :: 2 :: Nil 等同 1 :: (2 :: Nil)

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

    // 11.7 apply和update方法
    val scores = new mutable.HashMap[String, Int]()
    scores("Bob") = 100 // 调用 scores.upldate("Bob", 100)
    val bobsScore = scores("Bob") // 调用scores.apply("Bob")

    class Fraction1107(n: Int, d: Int){

    }
    object Fraction1107 {
    def apply(n: Int, d: Int) = new Fraction1107(n,d)
    }
    // 因为有apply方法,可以直接用Fraction1107(3,4)构造对象,而不用 new Fraction1107(3,4)

    // 11.8 提取器
    // 提取器就是一个带unapply方法的对象
    // 可以把unapply方法当做是伴生对象中apply方法的反向操作
    // apply方法接受构造参数,然后将它们变成对象
    // unapply方法接受一个对象,然后从中提取值,这些值就是当初用来构造对象的值
    class Fraction(val num: Int, val den: String){
    }
    object Fraction {
    def unapply(input: Fraction): Unit = {
    if(input.den == 0) {
    None
    }else{
    Some((input.num, input.den))
    }
    }
    }
    // 从字符串中提取名字和姓氏
    class Name(val first: String, val last: String) {

    }
    object Name {
    def unapply(input: String) = {
    val words = input.split("\s+")
    if(words.length != 2) {
    None
    }else{
    Some((words(0)),(words(1)))
    }
    }
    }
    val author = "Cay Horstmann"
    val Name(first, last) = author
    // 每个样例类都自动具备apply和unapply方法

    // 11.9 带单个参数或无参数的提取器
    // 在Scala中没有只带一个组件的无组。如果upapply方法要提取单值,则应该返回一个目标类型的Option
    object Number {
    def unapply(input: String): Option[Int] = {
    try{
    Some(Integer.parseInt(input.trim))
    } catch {
    case ex: NumberFormatException => None
    }
    }
    }
    val Number(n) = "1729"

    // 测试输入,返回Boolean
    object IsCompound {
    def unapply(input: String) = input.contains(" ")
    }
    // author match {
    // case Name(first, last @ IsCompound) => println("isCompound")
    // }

    // 11.10 unapplySeq方法
    // 要提取任意长度的值的序列,需用unapplySeq,返回一个Options[Seq[A]] ,其中A是被提取的值的类型
    object Name1110 {
    def unapplySeq(input: String): Option[Seq[String]] = {
    if(input.trim == ""){
    None
    } else {
    Some(input.trim.split("\s+"))
    }
    }
    }
    author match {
    case Name(first, last) => println("2")
    }






























    }
  • 相关阅读:
    获取多个checkbox的选中值
    谷歌57版本设置浏览器编码
    MySQL Date 函数
    easyui combobox下拉列表的多选值
    Maven_3 如何从Maven远程存储库下载
    Maven_2 本地资源库 中央存储库
    Maven_1 安装配置
    com.netflix.client.ClientException: Load balancer does not have available server for client xxxx
    spring cloud Eureka server 问题 Spring Cloud java.lang.TypeNotPresentException
    DotNet 资源大全中文版(Awesome最新版)
  • 原文地址:https://www.cnblogs.com/chenzechao/p/8709825.html
Copyright © 2011-2022 走看看