#julia
#джулия
Вопрос:
Я хочу выполнить условное назначение функции внутри функции (путем вызова функции bar1
или bar2
) на основе ее аргументов. Дело в том, что он должен назначить bar1
or bar2
функции с одним аргументом.
Это пример того, что я делаю:
function foo(a, b=false)
if b
f(t) = t*a; #bar1(t,a)
else
f(t) = t/a; #bar2(t,a)
end
return f(2.0);
end
Вызов
foo(1.1, true)
Выводит
1.8181818181818181
Вызов
foo(1.1, false)
Выводит
ERROR: UndefVarError: f not defined
Stacktrace:
[1] foo(::Float64, ::Bool) at C:UserspedroDocumentscodigosJulia_HEMcompara_hem_neumann.jl:89
[2] top-level scope at none:0
Почему f
не определено, когда b=false
?
Редактировать
Обходной путь заключается в определении для каждого условия отдельной функции. Например
function foo(a, b=false)
if b
f(t) = t*a; #bar1(t,a)
return f(2.0);
else
g(t) = t/a; #bar2(t,a)
return g(2.0);
end
end
Однако вопрос остается…
Комментарии:
1. Очень часто, когда код вашей функции зависит от такого утверждения true / false, возникает ситуация, при которой следует рассмотреть возможность использования
@generated
функции, зависящей от типа аргумента.
Ответ №1:
Это открытая проблема в языке Julia (см. https://github.com/JuliaLang/julia/issues/15602 ). В таких случаях рекомендуется использовать анонимную функцию.
function foo(a, b=false)
if b
f = t -> t*a
else
f = t -> t/a
end
return f(2.0)
end
Однако обратите внимание, что это будет не очень эффективно, поскольку компилятор не может определить тип возвращаемого foo
(поэтому, вероятно, вам пришлось бы добавить объявление возвращаемого типа функции). Ваш ответ при РЕДАКТИРОВАНИИ — тип стабильный.