2016-12-05 13 views
6
के माध्यम से एक समारोह के लिए खोजशब्दों और खोजशब्द चर मान पारित करने के लिए

आप आसानी से एक समारोह के लिए एक टपल के माध्यम से एक अंडाकार के साथ पारित कर सकते हैं "सामान्य" (यानी गैर कीवर्ड) चर मान, जैसे की तरह:कैसे tuples

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 

लेकिन कीवर्ड चर के लिए, आप चर के माध्यम से कीवर्ड और संबंधित चर दोनों मान कैसे पास करते हैं? उदा। (मूर्ख उदाहरण माफ): कीवर्ड के साथ keywords और इसी चर मान के साथ keywordvarvalues, कि g कार्य करने के लिए पारित किया जा सकता:

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 के अनुरूप परिभाषित करना चाहते हैं। कुछ इस तरह है, लेकिन यह काम करता है:

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

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

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

मुझे लगता है मैं हमेशा keywords और keywordvarvalues से इस स्ट्रिंग रचना कर सकते हैं:

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)