我正在查看这个线程
我正在尝试理解以下代码行:
struct Foo end
(::Type{Float64})(::Foo) = "not a Float64"
它似乎为Foo
类型的变量分配了一个字符串,但我在左侧没有看到任何变量声明。
发生了什么事?
这里发生了一些事情。
- 行是一个方法,而不是变量赋值。
f(x) = "blah"
是
function f(x)
"blah"
end
(::Foo)
部分实际上是该方法的一个带注释的参数。参数的名称可以省略,只是不能在方法体中使用参数,因为没有变量引用它。参数只分派方法。例如,f(::Foo) = "blah"
对f(Foo())
有效,但对f(Bar())
无效。(::Type{Float64})
部分而不是方法名表示这是一个函子。(f::F)(x) = x*f.suffix
意味着可以像方法F(".net")("something")
一样调用结构体F
的实例。名称f
不是一个方法名称,也不存在供您使用的名称,它是用来引用方法中要使用的F
的实例的。如果在方法(::F)(x) = x*".com"
中未使用该名称,则可以省略该名称。Type{Float64}
是唯一实例为Float64
的类型,因此这意味着您只能通过调用Float64(Foo())
来使用此方法。在我看来,定义一个方法Base.Float64(::Foo) = "not a Float64"
是等价的,我实际上不知道他们为什么选择函子语法。
当您看到被括号包围的注释时,该注释只能属于括号中和左边的任何内容。f::Foo
表示f用Foo
进行注释,f(::Foo)
表示匿名参数用Foo
进行注释。