zoukankan      html  css  js  c++  java
  • scala学习手记9

    = 赋值运算

    scala的赋值运算和java的有着很大的不同。如a=b这样的赋值运算,在Java中返回值是a的值,在scala中返回的则是Unit(Unit是值类型,全局只存在唯一的值,即(),通常Unit只用来声明函数或方法的返回值,其他场景基本是没有意义的)。这样就很容易导致一些错误地使用,比如a=b=c这样的赋值运算在java中是绝对可以的,但是在scala中运行就会报错。看一段代码:

    var a, b, c = 1
    a =  b=c
    println(a)

    上面这段代码还没有执行就在IDE中提示错误了,勉强执行下看看会报什么错:

    image

    报了类型不匹配的错误,因为在第一行代码中scala推断a是一个Int型的变量,后又将b=c的运算结果——一个Unit值——赋值给它,那当然会报错了。

    即使只在scala中看赋值运算符“=”号也是一个比较奇怪的东西:它不是一个方法,在默认情况下不可以这样使用——a.=(1)。对于这一点暂时无法深入探究,以后有时间慢慢再看。

    ==运算

    在java中,基本类型和引用类型对==运算有着不同的计算方式:

    • 对于基本类型来说,==运算比较的就是两边表达式的值;
    • 对于引用类型来说,==运算比较的是两边对象的引用而非是对象的值;在Java中比较对象的值使用的是equals方法。

    在scala中没有对象,不论类型如何,==运算都是面向值的。这一点由scala的Any类(scala中所有的类都是由它派生而来)提供了保证:它将==()方法实现为final的方法。因此在scala中进行值的比较就可以简单使用==运算,如果还有一些特殊化的比较,就需要改写equals方法了。在scala中如果想执行对于引用的比较可以使用eq()方法。看一下下面这段程序:

    val str1 = "hello"
    val str2 = "hello"
    val str3 = new String("hello")
    
    println(str1 == str2) // Equivalent to Java's str1.equals(str2)
    println(str1 eq str2) // Equivalent to Java's str1 == str2
    println(str1 == str3)
    println(str1 eq str3)

    程序的执行结果:

    image

    结果很清楚了。

    ---------------------------------------------------

    今天学了scala的=和==,这两个运算和Java中对应符号的运算有着明显的不同,以后需要注意下。

    #########

  • 相关阅读:
    printcap
    browser-ua
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode70 爬楼梯
  • 原文地址:https://www.cnblogs.com/amunote/p/5576192.html
Copyright © 2011-2022 走看看