2016-09-03 3 views
3

私はジュリアを使い始めました。私は関数内の変数のセットを定義するためにeval(Juliaで)を使用しようとしています。のは、私が2に等しいV1を設定したいとしましょう:ジュリアでevalを使ってvarargsを扱う

関数を呼び出す
function fun_test(varargs...) 
    v1 = 0; 

    if length(varargs) > 0 
    j = collect(linspace(1,length(varargs)-1,length(varargs)/2)); 

    for i in j 
     expr_vargs = parse("$(varargs[i]) = $(varargs[i+1]);"); 
     eval(expr_vargs); 
    end 
    end 

    println(v1) 

end 

として:

fun_test("v1", "2"); 

それはprintlnの戻り0(V1の初期値)以来、動作しません。しかし、私がJuliaの端末で類似の評価呼び出しを実行すると、それは機能します。

なぜ機能しないのか、どうやって解決するのかを教えてください。

+1

あなたの 'expr_vargs'は問題ありません。それは 'eval'です... – Memming

+0

こんにちは@Memming。あなたが意味するものを明確にしてください。 – merch

+1

'eval'はグローバルスコープで動作しますが、' v1'は 'v1 = 0'という行のためにローカルです。 –

答えて

5

evalは、機能範囲内ではなく、toplevel scopeで実行されます。関数スコープ内のバインディングを動的に更新することはできません。あなたの正確なユースケースを知らなければ、私は動的な再バインディングなしでやることができると思う。特に、v1,v2などはおそらく配列Vに最もよく作られています。それでも

、あなたが本当には、あなたが常にサブモジュールのグローバル変数としてv1を定義することができなければならない場合:

module FunTest 
v1 = 0 
function fun_test(varargs...) 

    if length(varargs) > 0 
    j = collect(linspace(1,length(varargs)-1,length(varargs)/2)); 

    for i in j 
     @eval $(varargs[i]) = $(varargs[i+1]) 
    end 
    end 

    println(v1) 

end 
export fun_test 
end 
using .FunTest 
fun_test(:v1, 2) # result: 2 

(私も最善行われparse INGの文字列を避けるために、あなたのコードを、変更した

expression interpolation

関連する問題