gpt4 book ai didi

module - 如何在 Julia 中本地扩展 Base 运算符(在模块中)

转载 作者:行者123 更新时间:2023-12-04 07:54:57 25 4
gpt4 key购买 nike


我不知道如何在本地扩展 Base 运算符,而且我找不到任何相关信息。
我显然可以在全局范围(REPL 或模块)中重新定义它:

import Base.-

-(x, y::Nothing) = nothing
-(x::Nothing, y) = nothing

但我想让它在我的模块中保持私有(private),而不是自动导出到全局范围,以免污染它,并且仍然能够在模块中的某些函数中使用扩展。
我尝试使用 let ... end block ,甚至在我的模块函数中重新定义它,但它似乎无法正确导入 Base。
我想要这样的东西:

module MyModule
export my_visible_function

function -(x, y::SomeType)
# Base.- extension with x and ::SomeType
end

function my_visible_function()
# code using Base.- extension
end

end

有什么办法吗?

感谢您的帮助。

最佳答案

您可以创建自己的 - 函数,在您的模块中隐藏 Base.:-。只要在模块中定义 - 函数之前未显式调用 Base.:- ,这就会起作用。 (更多内容见下文。)然后您可以定义您的 - 函数,使其在大多数调用中返回到 Base.:-

这是一个例子:

module A
export foo

-(::Any, ::Nothing) = nothing
-(x, y) = Base.:-(x, y)
foo(x, y) = x - y

end
julia> using .A

julia> foo(1, 3)
-2

julia> foo(1, nothing)

julia> 1 - 3
-2

julia> 1 - nothing
ERROR: MethodError: no method matching -(::Int64, ::Nothing)

这是一个示例,表明在您定义自己的 - 函数之前,可以在函数定义中使用 Base.:-:

# This works.

module B
export foo, bar

bar(x, y) = Base.:-(x, y)

-(::Any, ::Nothing) = nothing
-(x, y) = Base.:-(x, y)

foo(x, y) = x - y

end

只有当您在定义自己的 - 之前显式调用 -(从 Base)时,这才会起作用。这是一个例子:

julia> module C
export foo

1 - 3
-(::Any, ::Nothing) = nothing
-(x, y) = Base.:-(x, y)
foo(x, y) = x - y

end
ERROR: error in method definition: function Base.- must be explicitly imported to be extended

关于module - 如何在 Julia 中本地扩展 Base 运算符(在模块中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66754258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com