Выполнение условного назначения внутренней функции

#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 (поэтому, вероятно, вам пришлось бы добавить объявление возвращаемого типа функции). Ваш ответ при РЕДАКТИРОВАНИИ — тип стабильный.