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

Roy*_*son 5 julia

我正在看这个线程

我试图理解以下代码行:

struct Foo end
(::Type{Float64})(::Foo) = "not a Float64"
Run Code Online (Sandbox Code Playgroud)

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

到底是怎么回事?

Bat*_*aBe 6

这里发生了一些事情。

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

  2. (::Type{Float64})部分而不是方法名称表明这是一个仿函数(f::F)(x) = x*f.suffix意味着 struct 的实例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