对于集合(不可变)和字符串(可变)===&引用;不';t似乎不符合Julia中的文档(至少1.5版)

对于集合(不可变)和字符串(可变)===&引用;不';t似乎不符合Julia中的文档(至少1.5版),julia,immutability,equality,mutable,Julia,Immutability,Equality,Mutable,我想我遗漏了一点,因为在我的测试中,“==”的行为似乎与文档不符 文档中说“首先比较x和y的类型。如果它们相同,可变对象将按内存中的地址进行比较,不可变对象(如数字)将按位级别的内容进行比较” 我从这个定义中了解到: 对于可变对象,两个不同的对象(即不同的内存地址)不应为“==” 对于不可变对象,当内容相同时,它们应为“=” 但是: 集合是不可变的,但内容中的两个相同对象不是“==” 返回false set1 === set2 返回false,但根据文档,应返回true,因为set1和s

我想我遗漏了一点,因为在我的测试中,“==”的行为似乎与文档不符

文档中说“首先比较x和y的类型。如果它们相同,可变对象将按内存中的地址进行比较,不可变对象(如数字)将按位级别的内容进行比较”

我从这个定义中了解到:

  • 对于可变对象,两个不同的对象(即不同的内存地址)不应为“
    ==
  • 对于不可变对象,当内容相同时,它们应为“
    =
但是:

集合是不可变的,但内容中的两个相同对象不是“
==

返回
false

set1 === set2 
返回
false
,但根据文档,应返回
true
,因为
set1
set2
是两个内容相同的不可变对象。(或
ismutable(set1)
应返回
true
?)

字符串是可变的,但两个不同的对象是“
=

返回
true

string1 === string2 
返回
true
,但根据文档,应该返回
false
,因为
string1
string2
是两个不同的可变对象,因此它们在内存中的地址应该不同。(或
ismutable(string1)
应返回
false
?)



我遗漏了什么?

这些案例很棘手,我同意这不是直观的<代码>设置更容易解释

Set
定义为:

struct Set{T} <: AbstractSet{T}
    dict::Dict{T,Nothing}

    Set{T}() where {T} = new(Dict{T,Nothing}())
    Set{T}(s::Set{T}) where {T} = new(Dict{T,Nothing}(s.dict))
end

struct Set{T}所以在实践中,集合是不可变的,但是可变的,字符串是可变的,但是不可变的;-)我从未在代码中使用过
ismutable
。我认为最好将其视为一个低级函数,在处理内部时使用它来获取变量类型的
可变
字段。实际上,通过您对这个问题的回答和我的回答,我现在更好地理解了
=
=
运算符。谢谢
string1 === string2 
struct Set{T} <: AbstractSet{T}
    dict::Dict{T,Nothing}

    Set{T}() where {T} = new(Dict{T,Nothing}())
    Set{T}(s::Set{T}) where {T} = new(Dict{T,Nothing}(s.dict))
end