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

von*_*ein 7 hash julia

我仍然是朱莉娅的新手,并且对以下行为非常恼火:

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")以为是真的.任何人都可以澄清为什么不是吗?

谢谢.

Rez*_*lan 5

朱莉娅有两种类型的平等比较:

  1. 如果你想检查x和y是否相同,那么没有程序可以区分它们.然后正确的选择是使用is(x,y)函数,而执行此类比较的等效运算符是===运算符.棘手的部分是两个可变对象如果它们的内存地址相同则相等,但是当你比较两个不可变对象is时,如果内容在位级别相同则返回true.

2 === 2 #=> true, because numbers are immutable

"Foo" === "Foo" #=> false

  1. ==运算符或它的等效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