我仍然是朱莉娅的新手,并且对以下行为非常恼火:
immutable X
x::ASCIIString
end
"Foo" == "Foo"
true
X("Foo") == X("Foo")
false
Run Code Online (Sandbox Code Playgroud)
但使用Int而不是ASCIIString
immutable Y
y::Int
end
3 == 3
true
Y(3) == Y(3)
true
Run Code Online (Sandbox Code Playgroud)
我原X("Foo") == X("Foo")以为是真的.任何人都可以澄清为什么不是吗?
谢谢.
朱莉娅有两种类型的平等比较:
is(x,y)函数,而执行此类比较的等效运算符是===运算符.棘手的部分是两个可变对象如果它们的内存地址相同则相等,但是当你比较两个不可变对象is时,如果内容在位级别相同则返回true.2 === 2 #=> true, because numbers are immutable
"Foo" === "Foo" #=> false
==运算符或它的等效isequal(x,y)函数,称为泛型比较,如果存在这种类型的参数的合适方法,则返回true,其次返回true.那么如果没有列出该方法怎么办?然后==呼叫===运营商.现在对于上面的情况,你有一个不具有==运算符的不可变类型,所以你真的调用===运算符,它检查两个对象在位级别的内容是否相同,并且它们不是因为它们引用不同的字符串对象和"Foo" !== "Foo"
编辑:
正如@Andrew所提到的,请参阅Julia文档,字符串是不可变数据类型,为什么"test"!=="true" #=> true呢?如果您查看String数据类型的结构,例如xdump("test") #=> ASCIIString data: Array(UInt8,(4,)) UInt8[0x74,0x65,0x73,0x74],您会发现字符串是具有重要data字段的复合数据类型.Julia Strings主要是一个字节序列,存储在dataString类型的字段中.和isimmutable("test".data) #=> false