2017-04-06 50 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的動態調度功能?

相關問題