2017-04-06 13 views
3

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

「しかし、それがジュリアであなたの問題を解決する最善の方法であるかどうかは別の質問です」 「しかし、これはおそらくあなたの問題を解決する最良の方法ではない」と言うかもしれません。 このようなjuliaでOOを実装できると考えるのは、やや一般的な新人のミスであるため、ここで不明瞭なことは野生の価値があると思います。 (そして、彼らは間違っているわけではありませんが、あなたはそのようなコードがどのようにユニダイマであるかを知っています、私は確信しています)。 –

+0

@LyndonWhiteええ、良い点。それが私の意図だった。 –

+2

@LyndonWhite、ちょうど笑いのために、このポストとJeff 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の動的なディスパッチ機能に頼るものの代わりにこれを行うのですか?

関連する問題