gpt4 book ai didi

string - Julia 似乎没有使用字符串来执行插值

转载 作者:行者123 更新时间:2023-12-04 17:32:14 24 4
gpt4 key购买 nike

官方文档指出:

Both concatenation and string interpolation call string() to convert objects into string form



但是,以下最小工作示例似乎证明了其他情况:
type MyType
x::Int
end
import Base.string
Base.string(m::MyType) = "world"
m = MyType(4)
println("hello $m")
println("hello " * string(m))

倒数第二行计算为 hello MyType(4)在 REPL,而最后一行(如预期)计算为 hello world .

那么我做错了什么?

(我仍在使用 v0.4,但官方文档版本表明这不应该有任何区别。)

最佳答案

该文档是完全正确的:

julia> expand(:(println("hello $m")))
:(println((Base.string)("hello ",m)))

也就是说, println("hello $m")等效 println(string("hello", m)) .当代码被编译或解释时,它们是同一回事。

但是,您的重载
Base.string(m::MyType) = "world"

不是重载的正确方法 string .此方法仅涵盖类型为 MyType 的单个参数的情况。 . (这就是为什么,顺便说一句,您的代码似乎适用于连接:该特定示例涉及在单个参数上调用 string。如果您编写了 "$m",结果将是相同的。)重载它的正确方法是
Base.show(io::IO, m::MyType) = print(io, "world")

起初可能看起来很奇怪。这个必须重载的原因是因为 string代表 print委托(delegate)给 show .

将您的最小工作示例更新为
type MyType
x::Int
end
Base.show(io::IO, m::MyType) = print(io, "world")
m = MyType(4)
println("hello $m")
println("hello " * string(m))

结果如预期。

作为脚注,请注意您的示例可以更高效地编写为
println("hello ", m)

这避免了中间字符串的创建。这说明了为什么系统设置为 string来电 print调用 show : IO 方法比较通用,可以直接打印到各种形式的 IO,反之则需要先将内容转换成字符串(需要临时分配,因此性能较差),然后再发送到 IO。

关于string - Julia 似乎没有使用字符串来执行插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40066212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com