在此 Julia 代码中如何将字符串分配给结构?

How is a string assigned to a struct in this Julia code?

我在看this thread

我正在尝试理解以下代码行:

struct Foo end
(::Type{Float64})(::Foo) = "not a Float64"

它似乎将字符串分配给类型为 Foo 的变量,但我在左侧没有看到任何变量声明。

这是怎么回事?

这里发生了一些事情。

  1. 该行是方法,不是变量赋值。 f(x) = "blah"
  2. 的单行语法
function f(x)
  "blah"
end
  1. (::Foo) 部分实际上是该方法的 1 个注释参数。参数的名称可以省略,只是不能在方法体中使用参数,因为没有变量引用它。参数仅分派方法。例如,f(::Foo) = "blah" 适用于 f(Foo()) 但不适用于 f(Bar())

  2. (::Type{Float64}) 部分而不是方法名称表明这是一个 functor(f::F)(x) = x*f.suffix 意味着结构 F 的实例可以像方法 F(".net")("something") 一样被调用。名称 f 不是方法名称,不会存在供您使用,它是用来引用要在方法中使用的 F 的实例。如果方法中没有使用名称,则可以省略 (::F)(x) = x*".com".

  3. Type{Float64}是一个类型,它的唯一实例是Float64,所以这意味着你只能通过调用Float64(Foo())来使用这个方法。在我看来,定义一个方法 Base.Float64(::Foo) = "not a Float64" 是等价的,我实际上不知道他们为什么选择仿函数语法。

当您看到被括号包围的注释时,注释只能属于括号中和左侧的任何内容。 f::Foo 表示 f 被注释为 Foof(::Foo) 表示匿名参数被注释为 Foo