julia – 如何根据变量值在函数内定义函数

我正在编写一个函数,如果它可以根据变量的输入或运行时值(然后使用该函数)定义另一个函数,我会发现它更容易编写和读取.下面说明了这个想法(即使在这个简单的例子中定义函数内部的函数没有任何优势):

julia> function f(option::Bool)
           if option
               g() = println("option true")
               g()
           else
               g() = println("option false")
               g()
           end
       end;
WARNING: Method definition g() in module Main at REPL[1]:3 overwritten at REPL[1]:6.

julia> f(true)
option false

julia> f(false)
ERROR: UndefVarError: g not defined
 in f(::Bool) at .\REPL[1]:7

使用g的完整函数…结束语法也无济于事.

问题是:我是否做错了以获得警告和意外行为,或者朱莉娅不允许这样做?如果可以做到,怎么做?

注:对于我目前的需要,我可以定义两个不同的函数,g1和g2,它似乎工作;但是如果只有一个任务概念有很多g的情况呢?我认为作为第一类对象的函数可以自由操作:分配给变量,根据条件以某种方式定义,覆盖等等.

附:我知道我可以编写一个String然后解析它,但这是一个丑陋的解决方案.

最佳答案
您想使用匿名函数. This is a known issue(this other issue also shows your problem).

function f(option::Bool)
           if option
               g = () -> println("option true")
           else
               g = () -> println("option false")
           end
         g
       end

在v0.5中,匿名函数和泛型函数之间没有性能差异,因此没有理由不使用匿名函数.请注意,还有一个用于扩展匿名函数的sytnax:

f = function (x)
    x
end

并且您可以通过调用重载添加调度:

(T::typeof(f))(x,y) = x+y

所以没有理由不在这里使用匿名功能.

转载注明原文:julia – 如何根据变量值在函数内定义函数 - 代码日志