zoukankan      html  css  js  c++  java
  • 抹掉Scala的糖衣(14) -- Update Method

    欢迎关注我的新博客地址:http://cuipengfei.me/

     

    在Scala中,名字叫做update的方法是有特殊作用的。

    比方:

    1
    2
    3
    
    val scores = new scala.collection.mutable.HashMap[String, Int]
    scores("Bob") = 100
    val bobsScore = scores("Bob")
    

    以上三行代码,我们创建了一个可变的map来存储得分情况,然后我们记录了Bob的得分是100分,最后我们又把Bob的分数取出来了。

    这三行代码看似平淡无奇,实则暗藏了一点点玄机。

    第二行实际是调用了HashMap的update方法。

    第三行实际是调用了HashMap的apply方法。

    我们能够把上面的代码改写成以下的等价形式:

    1
    2
    3
    
    val scores = new scala.collection.mutable.HashMap[String, Int]
    scores.update("Bob", 100)
    val bobsScore = scores.apply("Bob)
    

    尽管等价。可是可读性却减少了一些。

    apply方法我们之前讲过,就不再赘述。

    update方法也不太复杂,它的规则就是:

    1
    
    x(y) = z
    

    这种代码会被编译为:

    1
    
    x.update(y, z)
    

    这次博文名字尽管以抹掉糖衣开头,实则有点名不符实。由于这个语言特性过于简单。糖衣非常薄,一抹就透。

    这次的目的主要是介绍一个update方法的适用场景。

    我们来看用来改动某个人地址的一段代码:

    1
    2
    3
    4
    5
    6
    7
    8
    
    class AddressChanger {
    
      def update(name: String, age: Int, newAddress: String) = {
        println(s"changing address of $name, whose age is $age to $newAddress")
        //actually change the address
      }
    
    }
    

    我们能够这样来调用它:

    1
    2
    
    val changer = new AddressChanger()
    changer.update("xiao ming", 23, "beijing")
    

    或者,我们也能够这样来调用它:

    1
    2
    
    val addressOf = new AddressChanger()
    addressOf(name = "xiao ming", age = 23) = "beijing"
    

    这两段代码是等价的。

    比較一下,前一种使用方法显得中规中矩,没什么特别好的,也没啥特大的毛病。

    但是后一种使用方法就不同了,读起来非常通顺。有读英语语句的感觉:把名字叫做小明,年龄23岁的人的地址改为北京。

    假设再给AddressChanger加上一个apply方法,我们还能够写这种代码:

    1
    
    val currentAddress = addressOf(name = "xiao ming", age = 23)
    

    这样。读取和更新的代码都看起来很自然。

    假设我们把这两段代码连起来看:

    1
    2
    
    val currentAddress = addressOf(name = "xiao ming", age = 23)
    addressOf(name = "xiao ming", age = 23) = "beijing"
    

    感觉甚好。

    addressOf(name = “xiao ming”, age = 23)能够看做一个总体,它就如同一个可读可写的属性。

    我们把它放到赋值语句的右側,就能取到小明的当前住址。

    我们把它放到赋值语句的左側,就能改动小明的住址。

    apply和update都是蛮简单的语言特性,可是加以合适的应用。却能得到可读性极强的代码。

  • 相关阅读:
    vim黏贴代码格式混乱的解决方法
    fopen()和fclose()的用法
    简谈switch case
    【转】如何确定Kafka的分区数、key和consumer线程数
    【转】Kafka producer原理 (Scala版同步producer)
    【转】 使用maven创建web项目
    【转】使用Eclipse构建Maven项目 (step-by-step)
    eclipse的安装环境及eclipse下maven的配置安装
    strtol,strtoll,strtoul, strtoull字符串转化成数字
    Kafka Producer相关代码分析【转】
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6748063.html
Copyright © 2011-2022 走看看