2017-04-06 141 views
3

是否可以访问在朱莉娅的另一个函数中定义的函数?例如:在另一个函数中定义的访问函数

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 
+6

除非您返回它或者在您想要使用它的地方定义的指针指向它。 –

+0

您可以*返回*在另一个函数内定义的函数。那是你在找什么?例如,在你的例子中返回匿名函数x-> x * g(x)。 –

回答

5

号在朱莉娅,它往往是更ideomatic使用模块的本地函数

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) 

有什么用呢?您可以定义一个自定义类型,给它一个函数字段,然后使该类型可调用(一个闭包)来实现您想要的行为。但是,这是否是解决你在茱莉亚问题的最佳方式是一个不同的问题。

+1

而不是说“但是否这是解决你在茱莉亚问题的最佳方式是一个不同的问题。”你可能会说“但这可能不是解决你的问题的最好方法。” 我觉得在这里不值得一提是值得的,因为这是一个适度常见的新人错误,认为他们可以在这样的茱莉亚实施面向对象。 (他们没有错,因此,但你知道这样的代码会是多么的单一,我相信。) –

+0

@LyndonWhite是的,好点。这就是我的意思。 –

+2

@LyndonWhite,只是为了笑,不过,看看这篇文章和杰夫B的回应:http://stackoverflow.com/questions/39133424/how-to-create-a-single-dispatch-object-oriented- JULIA-that-behaves-l –

1

你可以做到这一点,如果你的函数f是一个可调用类型的实例,包含函数g作为访问的领域:

julia> type F 
     g::Function 
     end 

julia> function(p::F)(x)  # make type F a callable type 
     x * p.g(x) 
     end 

julia> f = F(function (x) return x.^2 end) # initialise with a function 
F(#1) 

julia> f(2) 
8 

julia> f.g 
(::#1) (generic function with 1 method) 

如果g始终有固定的功能,那么你可以通过将其引入一个内部构造函数。

但是为了回应上面的Lyndon的评论,更好的问题是,为什么你会这样做,而不是依赖julia的动态调度功能?

相关问题