Julia 我应该在什么时候使用“==`vs`==`vs`isequal`

Julia 我应该在什么时候使用“==`vs`==`vs`isequal`,julia,Julia,我知道朱莉娅有三种不同的方式 做平等的事 =、==和isequal 我应该使用哪种,何时使用?=是内置的等式。 在基本体上,这是值相等:如果它们具有相同的位级表示,则它们相等 在可变结构上,它是引用相等:如果它们是相同的内存位置,则它们是相等的 在不可变结构上,这是结构相等:如果两个结构属于同一类型,并且它们的所有字段都相等,则这两个结构相等 在所有3种情况下,这或多或少只是位级别的相等,对内存的引用是指针。 (但是为了使不可变结构版本递归,需要一些想象力) 理想情况下,人们不会使用这么多,

我知道朱莉娅有三种不同的方式 做平等的事

=
==
isequal

我应该使用哪种,何时使用?

=
是内置的等式。
  • 在基本体上,这是值相等:如果它们具有相同的位级表示,则它们相等
  • 在可变结构上,它是引用相等:如果它们是相同的内存位置,则它们是相等的
  • 在不可变结构上,这是结构相等:如果两个结构属于同一类型,并且它们的所有字段都相等,则这两个结构相等
在所有3种情况下,这或多或少只是位级别的相等,对内存的引用是指针。 (但是为了使不可变结构版本递归,需要一些想象力)

理想情况下,人们不会使用这么多,因为它是不可定制的。 有时,虽然它很好使用,因为优化器可以很好地对此进行推理,因此它可以为热循环带来更好的性能

=
是通用等式 它是可重载的。 对于浮点数,它遵循IEEE规则,即
-0.0==0.0
NaN!=NaN
。 它遵循
missing==missing
的3值逻辑规则,导致
missing

如果未定义
=
,则返回到
==

如果已经定义了
=
,则需要将
哈希定义为
isequal
返回到使用
=
,请参见下文

isequal
对于词典来说是平等的。 我不知道还有什么更好的说法。 对于
Dict
Set
而言,
isequal
被认为是相同的。 因此,在
Dict
中,不能将两个
isequal
项作为不同的键

如果要确保
NaN
s彼此相等,请使用此选项, 同样地,缺失是相等的

定义
isequal
时,还必须定义
hash
isequal(a,b)
意味着
hash(a)==hash(b)

如果未定义
isequal
,则返回到
=

基本上:

  • 当您对两个对象的值感兴趣时:
    1==1
    ->
    true
    1==1.0
    ->
    true
  • ==
    当您想确保两个对象无法区分时(包括指向不同内存的数组):
    1===1
    ->
    true
    但是
    1===1.0
    ->
    false
    A=[1,2,3];B=[1,2,3]
    导致
    A==B
    ->
    true
    A==B
    ->
    false
    A==A
    ->
    true
  • isequal()
    =
    相同,但处理浮点数的方式不同:
    NaN==NaN
    ->
    false
    isequal(NaN,NaN)
    ->
    true

更深入的讨论。

相关:检查后,此处将对其进行解释