在Odersky的书《Scala编程》第二版第89页第5.7节中,“==”运算符解释如下:
“如您所见,==经过精心设计,因此在大多数情况下,您可以获得所需的相等性比较。这是通过一个非常简单的规则完成的:首先检查左侧是否为 null,如果它不是 null,则调用 equals 方法...由于存在自动空检查,因此您不必自己进行检查(7)”
然后备注“7”:
"自动检查不会查看右侧,但任何合理的equals方法如果其参数为null,都应该返回false。"
如果空检查不查看RHS,我希望null==任何东西总是评估为假…但是我试过了,null==null评估为真。
这本书基于scala 2.8。是语言在某个时候发生了变化,还是我误解了解释?
在我使用的drools引擎中,==被解释为如果LHS为空,而RHS不为空,RHS的equals方法将被传递给LHS。尽管大多数合理的equals方法应该在nulls上返回false,但我喜欢drools引擎处理这种情况的方式。在SQL中,我习惯了null!= null。
这样做的原因是,==
是如何在 AnyRef 中实现的。
final def ==(that: AnyRef): Boolean =
if (this eq null) that eq null
else this equals that
eq
是一种检查两个变量是否引用同一个对象的方法,因此在这种情况下null==null
都eq null
在片段的第三行中检查返回true。
在我看来,引用的文本只说了如果 LHS 不为空
会发生什么,所以这部分没有矛盾。当 LHS 为空
时会发生什么的描述可能在您没有引用的文本的某些部分或完全丢失。
Note(7)解释说,如果LHS不是null
,则不会对RHS执行检查,RHS只是传递给equals
。因此,当比较某些表达式==null
之类的东西时,Scala首先检查某些表达式
是否为null,然后调用someExpression.equals(null)
。
我认为Scala的< code>term1 == term2被转换成了Java的
(term1 != null) ? term1.equals(term2) : (term2 == null)
(请注意,这是一个Java代码片段,因此上面一行中的==
表示Java的引用相等。)
我对学习如何用foldLeft函数在scala中实现Kadane(最大子数组和)算法感兴趣。我在堆栈溢出中运行了这个示例,但我不确定我是否理解该算法的确切功能。这就是算法的样子: 中包含的内容是否是需要应用于每个元素的lambda函数?还有,这行到底做什么?为什么括号里的括号用空格隔开?我很感激任何帮助,如果我的问题让人觉得太无知,我很抱歉,但我对Scala是新手
本文向大家介绍Scala求和示例代码,包括了Scala求和示例代码的使用技巧和注意事项,需要的朋友参考一下 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在Java虚拟机上,并兼容现有的Java程序。 Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库。 =>
我在Spark Java API项目中编写了一个mapToPair函数。我需要有一个类似于Scala None的功能,所以对于一个特定的地图,我可能不返回任何东西(Scala中没有) 例如,运行上述代码总是返回一个正的计数值,而不是0。
问题内容: 在Scala邮件列表中,不同的人经常说:“编译器将此[scala]代码重写为此[java / scala ??]代码”。例如,如果最新的线程之一,Scala看到 然后编译器将其重写为(有效): 我如何找出我的代码的编译器输出是什么?我应该为此反编译生成的字节码吗? 问题答案: 您可以使用“ -print”作为编译器选项,而scalac将删除所有Scala特定的功能。 例如,这是原始代码
问题内容: 首先采取klurudge解决方案,使用哨兵方法(必须让您的程序不允许输入哨兵值): 假设您忘记了阻止程序中的哨兵值,用户在B字段中输入了-2147483648,而A为空。上面的代码报告为true,应报告为false,不应报告为true或null。 比较可为空字段上的相等性的最简洁方法是什么?A == B仅应报告true或false,而不管该字段是否可为空。 问题答案: 也许IS [NO
问题内容: 我需要一些Scala和Java代码的代码示例(并且我也对此感到很好奇),这些示例表明Scala代码比用Java编写的代码更简单,简洁(当然,两个示例都应该解决相同的问题)。 如果只有Scala示例带有注释,例如“这是Scala中的抽象工厂,在Java中看起来会很麻烦”,那么这也是可以接受的。 谢谢! 我最喜欢的所有接受和这个答案 问题答案: 让我们改进堆栈器的示例,并使用Scala的c
迭代器不是集合,而是逐个访问集合元素的方法。 iterator it上的两个基本操作是next和hasNext 。 对it.next()调用将返回迭代器的下一个元素并提升迭代器的状态。 您可以使用Iterator的it.hasNext方法找出是否有更多元素要返回。 “逐步”迭代器返回的所有元素的最简单方法是使用while循环。 让我们按照以下示例程序进行操作。 例子 (Example) objec
在Java8中,Scala伟大的的等价物是什么? 我很想知道它是,但是reduce必须返回与它所还原的内容类型相同的内容。 例子: 上面代码中的问题是umulator: 因此,有人能给我指出与“foldLeft/修复我的代码”对应的正确方法吗?