我正在看这个线程
我试图理解以下代码行:
struct Foo end
(::Type{Float64})(::Foo) = "not a Float64"
Run Code Online (Sandbox Code Playgroud)
它似乎将一个字符串分配给类型为 的变量Foo,但我在左侧没有看到任何变量声明。
到底是怎么回事?
这里发生了一些事情。
f(x) = "blah"是单行语法function f(x)
"blah"
end
Run Code Online (Sandbox Code Playgroud)
该(::Foo)部分实际上是该方法的 1 个带注释的参数。参数的名称可以省略,只是不能在方法体中使用该参数,因为没有变量引用它。参数仅调度该方法。例如,f(::Foo) = "blah"适用于f(Foo())但不适用于f(Bar())。
该(::Type{Float64})部分而不是方法名称表明这是一个仿函数。(f::F)(x) = x*f.suffix意味着 struct 的实例F可以像方法一样被调用F(".net")("something")。该名称f不是方法名称,也不会像方法名称那样存在供您使用,它用于引用F方法中要使用的实例。如果方法中未使用该名称,则可以省略该名称(::F)(x) = x*".com"。
Type{Float64}是一个唯一实例为 的类型Float64,因此这意味着您只能通过调用 来使用此方法Float64(Foo())。在我看来,定义一个方法Base.Float64(::Foo) = "not a Float64"是等效的,我实际上不知道他们为什么选择仿函数语法。
当您看到括号包围的注释时,该注释只能属于括号内和左侧的内容。f::Foo表示 f 注释为Foo,f(::Foo)表示匿名参数注释为Foo。
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |