Hash 朱莉娅:不可变的复合类型

Hash 朱莉娅:不可变的复合类型,hash,julia,Hash,Julia,我对julia还是个新手,对以下行为非常恼火: immutable X x::ASCIIString end "Foo" == "Foo" true X("Foo") == X("Foo") false 但是使用Int而不是ascistring immutable Y y::Int end 3 == 3 true Y(3) == Y(3) true 我原以为X(“Foo”)==X(“Foo”)是真的。有人能澄清为什么不是这样吗 谢谢。朱莉娅有两种平等比较: 如果要检查x和y是否相

我对julia还是个新手,对以下行为非常恼火:

immutable X
  x::ASCIIString
end

"Foo" == "Foo"
true
X("Foo") == X("Foo")
false
但是使用Int而不是ascistring

immutable Y
  y::Int
end

3 == 3
true
Y(3) == Y(3)
true
我原以为
X(“Foo”)==X(“Foo”)
是真的。有人能澄清为什么不是这样吗


谢谢。

朱莉娅有两种平等比较:

  • 如果要检查x和y是否相同,即没有程序能够区分它们。那么正确的选择是使用
    is(x,y)
    函数,进行这种比较的等效运算符是
    ==
    运算符。棘手的是,如果两个可变对象的内存地址相同,那么它们是相等的,但是当比较两个不可变对象时,
    is
    返回true,如果内容在位级别相同
    2==2#=>true,因为数字是不可变的

    “Foo”==“Foo”#=>false

  • =
    运算符或其等价的
    isequal(x,y)
    函数,该函数称为泛型比较并返回true,前提是首先存在适合此类型参数的方法,然后该方法返回true。那么,如果没有列出该方法呢?然后呼叫话务员
  • 现在对于上述情况,您有一个不可变类型,它没有
    =
    运算符,因此您真正调用
    ==
    运算符,它检查两个对象在位级别的内容是否相同,而不是因为它们引用不同的字符串对象和
    “Foo”!==“Foo”

    编辑:


    正如@Andrew提到的,请参阅Julia文档,字符串是不可变的数据类型,那么为什么
    “test”==“真的”#=>真的
    ?如果向下查看字符串数据类型的结构,例如通过
    xdump(“test”)#=>ascitring data:Array(UInt8,(4,))UInt8[0x74,0x65,0x73,0x74]
    ,您会发现字符串是具有重要
    数据
    字段的复合数据类型。Julia字符串主要是存储在字符串类型的
    数据
    字段中的字节序列。还有
    isimmutable(“test”).data#=>false

    我有点困惑,你说字符串是可变的,但说“在Java中,字符串是不可变的”。我犯了一个错误
    isimmutable(“test”)\#=>true
    ,答案需要编辑,非常感谢。这不仅解释了这种行为,也说明了人们是如何发现这种现象的。因此,我假设要实现我预期的行为,必须显式定义[…]
    ==(x1::X,x2::X)=x1.X==x2.X
    。我误解了文档()中的“集合通常通过对所有内容递归调用isequal来实现isequal”,将其作为集合类型的默认实现。但事实上,默认情况下,
    X(“Foo”)==X(“Foo”)
    也是
    X(“Foo”)==X(“Foo”)
    。再次感谢你的解释。