Scala对象的相等性比较

开发 后端
本文节选自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻译的《Programming in Scala》的第五章。Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言。

如果你想比较一下看看两个Scala对象是否相等,可以使用或者==,或它的反义!=。下面举几个例子:

  1. scala> 1 == 2 
  2. res24: Boolean = false 
  3. scala> 1 != 2 
  4. res25: Boolean = true 
  5. scala> 2 == 2 
  6. res26: Boolean = true 
这些操作对所有对象都起作用,而不仅仅是基本类型。例如,你可以用他比较列表:

  1. scala> List(123) == List(123)  
  2. res27: Boolean = true 
  3. scala> List(123) == List(456)  
  4. res28: Boolean = false 
进一步,你还可以比较不同类型的两个对象:

  1. scala> 1 == 1.0 
  2. res29: Boolean = true 
  3. scala> List(123) == "hello" 
  4. res30: Boolean = false 
你甚至可以比较null,或任何可能是null的东西。不会有任何异常被抛出:

  1. scala> List(123) == null 
  2. res31: Boolean = false 
  3. scala> null == List(123)  
  4. res32: Boolean = false 
如你所见,==已经被仔细地加工过,因此在许多情况下你都可以得到你想要的相等性的比较。这只是用了一个非常简单的规则:首先检查左侧是否为null,如果不是,调用equals方法。由于equals是一个方法,因此比较的精度取决于左手边的参数。又由于已经有一个自动的null检查,因此你不需要手动再检查一次了。自动检查机制不会检查右手侧的参数,但是任何合理的equals方法都应在参数为null的时候返回false。

这种类型的比较对于不同的对象也会产生true,只要他们的内容是相同的并且它们的equals方法是基于内容编写的。例如,以下是恰好都有五个同样字母的两个字串的比较:

  1. scala> ("he" + "llo") == "hello" 
  2. res33: Boolean = true 
Scala的==与Java的有何差别

Java里的既可以比较原始类型也可以比较参考类型。对于原始类型,Java的==比较值的相等性,如Scala。然而对于参考类型,Java的==比较了参考相等性:reference equality,也就是说这两个变量是否都指向于JVM堆里的同一个对象。Scala也提供了这种机制,名字是eq。不过,eq和它的反义词,ne,仅仅应用于可以直接映射到Java的对象。

【相关阅读】

  1. Scala的数学运算、关系和逻辑操作及位操作符
  2. Scala的操作符:任何方法都可以是操作符
  3. Scala的基本类型及文本化
  4. Scala程序及其Application特质
  5. Scala程序中的分号推断和Singleton对象
责任编辑:book05 来源: Artima
相关推荐

2011-12-16 14:34:22

Java

2011-06-28 09:51:08

.NET对象相等

2009-07-21 12:18:37

ScalaRational对象toString

2012-12-03 10:26:51

Scala

2009-07-22 09:22:20

Scala工厂对象

2020-12-29 06:44:18

GoScala编程语言

2009-09-09 11:14:16

Scala对象

2010-11-17 11:31:22

Scala基础面向对象Scala

2011-06-28 11:06:16

Scala

2009-06-22 14:26:12

ScalaXML对象

2010-03-11 10:34:22

Scala

2011-03-18 19:37:38

Eventable接口QtWidget

2009-07-20 18:03:26

Scala程序Singleton对象

2009-06-16 17:09:17

Scala面向对象函数编程

2011-06-28 11:05:19

Qt QWidget Eventable

2009-12-11 10:43:00

Scala讲座操作符函数

2009-07-08 16:10:24

Scala简介面向对象函数式

2009-09-27 15:29:00

Scala讲座面向对象Scala

2009-07-08 12:43:59

Scala ServlScala语言

2010-09-14 15:34:41

Scala
点赞
收藏

51CTO技术栈公众号