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

时间:2015-10-11 21:37:52

标签: hash julia

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

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

谢谢。

1 个答案:

答案 0 :(得分:5)

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

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

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

    1. ==运算符或它的等效isequal(x,y)函数,称为泛型比较,如果存在这种类型的参数的合适方法,则返回true,其次返回该方法真正。那么如果没有列出该方法怎么办?然后==致电===运营商。
    2. 现在对于上面的情况,你有一个不具有==运算符的不可变类型,所以你真的调用===运算符,并检查两个对象在位级别的内容是否相同,它们不是因为它们引用了不同的字符串对象而是"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