【问题标题】:Julia: Immutable composite typesJulia:不可变的复合类型
【发布时间】:2015-10-12 09:15:11
【问题描述】:

我对 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") 是真的。谁能澄清为什么不是?

谢谢。

【问题讨论】:

    标签: hash julia


    【解决方案1】:

    Julia 有两种相等比较:

    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?如果您查看字符串数据类型的结构,例如通过xdump("test") #=> ASCIIString data: Array(UInt8,(4,)) UInt8[0x74,0x65,0x73,0x74],您会发现字符串是具有重要data 字段的复合数据类型。 Julia 字符串主要是一个字节序列,存储在 String 类型的 data 字段中。和isimmutable("test".data) #=> false

    【讨论】:

    • 我有点困惑,你说字符串是可变的,但是the string documentation 说“就像在 Java 中一样,字符串是不可变的”。
    • 我写错了isimmutable("test") #=> true,答案需要编辑
    • 啊,非常感谢。这不仅解释了这种行为,而且还显示了人们如何发现这一点。所以我想实现我期望的行为必须明确定义
    • [...] ==(x1::X,x2::X) = x1.x == x2.x。我误读了“集合通常通过在所有内容上递归调用 isequal 来实现 isequal。”在文档 (julia.readthedocs.org/en/latest/stdlib/base) 中作为集合类型的默认实现。但实际上默认X("Foo") == X("Foo") 也是X("Foo") === X("Foo")。再次感谢您的精彩解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多