Methods 如何指定类型签名以在Julia中使用InteractiveUtils.edit查找特定方法?

Methods 如何指定类型签名以在Julia中使用InteractiveUtils.edit查找特定方法?,methods,julia,type-signature,Methods,Julia,Type Signature,为了快速找到一些方法的实现,我想使用interactiveeutils.edit 例如,如果我想看到methodswith的实现,我应该能够编写类似edit(methodswith)的东西。但是,由于带有函数的方法有多种方法,我得到: ERROR: function has multiple methods; please specify a type signature 如何指定类型签名?我知道我可以通过方法(methodswith)找出有哪些方法,并给出如下签名: [1] methodsw

为了快速找到一些方法的实现,我想使用
interactiveeutils.edit

例如,如果我想看到
methodswith
的实现,我应该能够编写类似
edit(methodswith)
的东西。但是,由于带有函数的
方法有多种方法,我得到:

ERROR: function has multiple methods; please specify a type signature
如何指定类型签名?我知道我可以通过
方法(methodswith)
找出有哪些方法,并给出如下签名:

[1] methodswith(t::Type; supertypes) in InteractiveUtils at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.0/InteractiveUtils/src/InteractiveUtils.jl:169
如何将其插入到调用
edit

我知道有一个
@edit
,我可以在一些示例性函数调用中使用它。然而,有时只指定类型更为简单,因为为方法的示例性调用构造对象还涉及对有效构造函数的一些调查

TL;医生:


如何使用Julia中的
interactiveeutils.edit
找到函数的特定方法?

只需将参数类型作为第二个位置参数中的元组传递给
edit

例如,
edit(sin,(Int,)
将打开与一个
Int
类型的参数一起使用的
sin
的定义

请注意,如果要编辑stdlib中的函数,此操作可能会失败(对于基本库或非标准库中的函数,
edit
将正常工作)

在这种情况下,您必须使用
方法
功能并手动定位文件。例如:

julia> using Statistics

julia> edit(mean, (Vector{Int},)) # this might not work as expected

julia> methods(mean, (Vector{Int},))
# 1 method for generic function "mean":
[1] mean(A::AbstractArray; dims) in Statistics at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.1\Statistics\src\Statistics.jl:132
现在您有了文件名和方法所在的行号,但路径可能错误,因此您必须自己在Julia安装文件夹中查找该文件

下面是如何通过编程检索此信息(假设您正确指定了
args
,并且只有一个方法匹配)。首先定义一个函数:

function edit_stdlib(fun, args)
    m = methods(fun, args)
    @assert length(m.ms) == 1 # assume we have an exact match
    p = joinpath(Sys.STDLIB, splitpath(string(m.ms[1].file))[end-2:end]...)
    l = m.ms[1].line
    edit(p, l)
end
现在您可以编写例如
edit_stdlib(mean,(Vector{Int},)
来获得您想要的