Julia 在另一个函数中定义的访问函数

Julia 在另一个函数中定义的访问函数,julia,Julia,是否可以访问julia中另一个函数中定义的函数?例如: julia> function f(x) function g(x) x^2 end x * g(x) end f (generic function with 1 method) julia> f(2) 8 julia> f.g(2) ERROR: type #f has no field g in eval_user_in

是否可以访问julia中另一个函数中定义的函数?例如:

julia> function f(x)
         function g(x)
           x^2
         end
         x * g(x)
       end

f (generic function with 1 method)

julia> f(2)
8

julia> f.g(2)
ERROR: type #f has no field g
 in eval_user_input(::Any, ::Base.REPL.REPLBackend) at ./REPL.jl:64
 in macro expansion at ./REPL.jl:95 [inlined]
 in (::Base.REPL.##3#4{Base.REPL.REPLBackend})() at ./event.jl:68

不。在julia中,使用模块实现本地功能通常更具意识形态

module F
function g(x)
    x^2
end

function f(x)
    x * g(x)
end

export f
end

using F

f(2)
F.g(2)

用例是什么?您可以定义一个自定义类型,给它一个函数字段,然后使该类型可调用(闭包),以实现您想要的行为。但这是否是解决julia问题的最佳方法是另一个问题。

如果函数
f
是可调用类型的实例,包含一个函数
g
作为可访问字段,则可以这样做:

julia>F型
g::函数
结束
julia>函数(p::F)(x)#使类型F成为可调用类型
x*p.g(x)
结束
julia>f=f(函数(x)返回x.^2结束)#用函数初始化
F(#1)
julia>f(2)
8.
朱莉娅>f.g
(:#1)(带1方法的泛型函数)
如果
g
始终是一个固定函数,那么可以通过内部构造函数引入它


但为了回应林登的上述评论,一个更好的问题是,为什么要这样做,而不是更多地依赖julia的动态分派功能?

除非您返回它,或者在要使用它的范围内定义了指向它的指针。您可以返回在另一个函数中定义的函数。这就是你要找的吗?例如,在您的示例中返回匿名函数x->x*g(x)。而不是说“但这是否是解决julia问题的最佳方法是另一个问题。”您可能会说“但这可能不是解决问题的最佳方法。”我认为在这里不含糊是值得的,因为认为他们可以像这样在julia中实现OO是一个相当常见的新手错误。(他们本身并没有错。但我相信你知道这样的代码是多么的不符合实际。)@LyndonWhite,不过,为了开怀大笑,看看这篇文章和杰夫B的回答:是的,这是一个很好的问题!甚至很好。写这封信的人一定很了不起pppMuarhaha,绝对:-)@MichaelK.Borregaard是的,对不起,我写了之后才意识到;当我第一次匆忙阅读的时候,结尾的部分把我甩了,所以我没有意识到这就是你的意思;我以为你在建议用闭包,这对我来说有点过分了。如果你愿意的话,很高兴你能把我的答案和你的合并在一起。我所说的“另一种方式”的意思是,你写这篇文章的方式意味着可调用类型是(实现为)闭包。我相信事实上是相反的:julia中的闭包是通过可调用类型在内部实现的。但并非所有可调用类型都是闭包。