2016-12-05 15 views
6
を経由して関数に、キーワードとキーワードの変数の値を渡す方法

あなたは簡単に例えばのように、省略記号でタプルを経由して関数に変数の値を(すなわち、非キーワード)を「通常」渡すことができます。タプル

julia> f(x, y, z) = x + y + z; 

julia> f(0, 1, 2) 
3 

julia> varvalues = 0, 1, 2 
(0,1,2) 

julia> f(varvalues...) 
3 

しかし、キーワード変数の場合、どのようにキーワードとそれに対応する変数値の両方を変数に渡しますか?例えばのように。 (愚かな例を許す):gを関数に渡すことができるキーワードをkeywordsと対応する変数の値を持つkeywordvarvalues

julia> function g(x, y, z; operation = "add", format = "number") 
      operation == "add" && format == "number" && return  x + y + z 
      operation == "add" && format == "string" && return string(x + y + z) 
      operation == "times" && format == "number" && return  x * y * z 
      operation == "times" && format == "string" && return string(x * y * z) 
     end;   # yep, I know this not type-stable 

julia> g(0, 1, 2, operation = "times", format = "string") 
"0" 

julia> g(varvalues..., operation = "times", format = "string") # varvalues = (0,1,2) 
"0" 

がだから、上記varvaluesと類似の2つの変数を定義したいです。このような何かが、それは動作します:

julia> keywords = :operation, :format 
(:operation,:format) 

julia> keywordvarvalues = "times", "string" 
("times","string") 

julia> g(varvalues..., keywords... = keywordvarvalues...) 
ERROR: MethodError: no method matching broadcast!... 

私はいつもkeywordskeywordvarvaluesからこの文字列を作成することができたとします

expressionstring = """g(varvalues..., operation = "times", format = "string")""" 

し、それを解析-EVALが、それはありません、prolly悪い習慣ですか?

答えて

6

これは動作します:

julia> keywords = :operation, :format 
(:operation,:format) 

julia> keywordvarvalues = 10, 20 
(10,20) 

julia> g(; operation=1, format=2) = (operation, format) 
g (generic function with 1 method) 

julia> g(; zip(keywords, keywordvarvalues)...) 
(10,20) 
+0

セミコロンが – tim

+0

は私が望んでいたまさに:)トリックを行います!ありがとうございました。 –

1

あなたはまた、辞書を使用することができます。

julia> g(; keywords...) = keywords 

julia> g(a=3, b=4) 
2-element Array{Any,1}: 
(:a,3) 
(:b,4) 

julia> d = Dict(:c=>5, :d=>6) 
Dict{Symbol,Int64} with 2 entries: 
    :c => 5 
    :d => 6 

julia> g(; d...) 
2-element Array{Any,1}: 
(:c,5) 
(:d,6)