определить функции Джулии с необязательными позиционными аргументами

По этой ссылке говорится:

# You can define functions with optional positional arguments
function defaults(a,b,x=5,y=6)
    return "$a $b and $x $y"
end

defaults('h','g') # => "h g and 5 6"
defaults('h','g','j') # => "h g and j 6"
defaults('h','g','j','k') # => "h g and j k"
try
    defaults('h') # => ERROR: no method defaults(Char,)
    defaults() # => ERROR: no methods defaults()
catch e
    println(e)
end

Я думаю, цель этого примера — показать, что если предоставленные аргументы меньше аргументов по умолчанию, функция также вернет аргументы по умолчанию.

Но почему ошибка появляется, когда не указан один аргумент или нет? т. е. как я узнаю, что два аргумента допустимы, а один или ни одного — нет?


person lanselibai    schedule 11.02.2018    source источник


Ответы (1)


Ответ довольно прост:

Для функции defaults необходимо указать как минимум два аргумента (a и b, которые не имеют значения по умолчанию), поскольку спецификации языка не позволяют обязательным позиционным аргументам находиться в "неизвестном состоянии". Если значение по умолчанию не указано, интерпретатор вызывает исключение. Ссылка на руководство, причина разработки за необязательными аргументами:

Необязательные аргументы на самом деле просто удобный синтаксис для написания нескольких определений методов с разным количеством аргументов.

Как будто они создают некоторые «функции», которые уже знают, какие аргументы. Ты пишешь:

defaults(a,b,x=5,y=6)

и внутренне существуют:

defaults(a, b, x, y)
defaults(a, b, x, 6)
defaults(a, b, 5, 6)

(и обратите внимание, что я не пишу defaults(a, b, 5, y), чтобы упростить обсуждение).

Вызов defaults с 3 аргументами допустим, но вы переопределите значение по умолчанию x. Вызывать его с 4 аргументами можно, но вы переопределите значения по умолчанию x и y. Вызов с менее чем двумя аргументами недопустим, потому что интерпретатор не знает, что возвращать (поскольку вам нужны a и b для интерполяции возвращаемой строки).

Вы можете определить функцию, которая потребует только один позиционный аргумент следующим образом:

function defaults(a,b=4,x=5,y=6)
    return "$a $b and $x $y"
end

Также есть дополнительная информация здесь .

person Matteo Ragni    schedule 11.02.2018