Hash 朱莉娅:不可变的复合类型
我对julia还是个新手,对以下行为非常恼火: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是否相
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”)
是真的。有人能澄清为什么不是这样吗
谢谢。朱莉娅有两种平等比较:
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”)
。再次感谢你的解释。