Ключевое слово Аргументы - Функции - PullRequest
0 голосов
/ 06 июня 2018

Я новичок в Юлия ,

как я могу создавать функции с ключевыми словами для аргументов без инициализации этих аргументов в функции?

Aочень простой пример :

function f(;a = 1, b = 2)
 a+b
end

Я хотел бы сделать:

function f(;a, b)
 a+b
end

С уважением.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Это строка в Julia 0.7:

Могут потребоваться аргументы ключевого слова: если значение по умолчанию опущено, генерируется исключение, если вызывающий не назначает ключевому слову значение ( # 25830 ).

Итак:

function f(;a, b)
    a+b
end

станет синтаксическим сахаром для:

function f(;a = throw(UndefKeywordError(:a)), b = throw(UndefKeywordError(:b)))
    a+b
end
0 голосов
/ 06 июня 2018

Другим обходным решением является создание функции с аргументами с переменным ключевым словом и оставление любых требований над ожидаемыми входными данными в качестве утверждений внутри кода.Например,

function f( ; kwargs... )
  V = Dict( kwargs )
  try; assert( haskey( V, :a ) ); assert( haskey( V, :b ) )
  catch e; throw( AssertionError("KWargs need to be a and b") )
  end
  V[:a] + V[:b]
end

f(a=1, b=2)   #> 3

f(a=1, c=2)   #> ERROR: AssertionError: KWargs need to be a and b

Или даже просто:

function f( ; kwargs... )
  V = Dict( kwargs )
  a = V[:a]
  b = V[:b]
  a + b
end

f(a=1, c=2)   #> ERROR: KeyError: key :b not found

Отказ от ответственности: я не рекомендую это, я просто говорю, что это еще один обходной путь, который следует учитывать в зависимости от того, какие функции у вас естьв виду.

0 голосов
/ 06 июня 2018

Это новая функция в версии 0.7 - вы можете написать ее так, как вам хочется.

Синтаксис Джулии в версиях 0.6 и более ранних требует, чтобы вы указали им значение по умолчанию, но так как это значение по умолчаниюзначение оценивается во время вызова , вы можете использовать функцию ошибки, чтобы потребовать их:

julia> function f(;a=error("a not provided"), b=error("b not provided"))
        a+b
       end
f (generic function with 1 method)

julia> f()
ERROR: a not provided
Stacktrace:
 [1] f() at ./REPL[1]:2

julia> f(a=2)
ERROR: b not provided
Stacktrace:
 [1] (::#kw##f)(::Array{Any,1}, ::#f) at ./<missing>:0

julia> f(a=2, b=3)
5
...