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