b=5
ff(x,a=b,b=1) = (a+b,x)
ff(3)
运行一下,豁然开朗。
julia> ff(x,b=1,a=b) = (a+b,x)
ff (generic function with 3 methods)
julia> ff(3)
(2, 3)
我也是接触Julia好久之后,才意识到这个的,比如,这里会从前面的参数里拿到值,而不是外部的作用域里。
您这个更深刻!
尝试理解:外部作用域没有全局和局部的概念,仅仅是它的上一个出现的。
我一直没意识到这个,但是我一直都没有遇到问题。我的朴素的理解就是先来后到。
b=5
ff(x,a=b,b=1)=(a+b,x)
a=b 的时候,后面的 b=1 还没有,因此用的就是外部的 b.
b=5
ff(x,b=1,a=b) = (a+b,x)
这种时候我能够理解 a=b 是指 b=1 因为我一直以来都是这么用的,后来的 b=1 已经覆盖了外部的
b=5,所以 a=1.
当然,实际中可能不是这么回事,我用的时候这样写是因为后续的参数 a 的值一般是依赖于前面的 参数 b 的值的。
所以从来没遇到过在
b=5
ff(x,b=1,a=b) = (a+b,x)
这种情况下需要把 a 默认为 5 的情况。
我的理解是这样的
ff(x,b=1,a=b)=(a+b,x)
会生成3个方法
ff(x)
ff(x, b)
ff(x, b, a)
所以它展开是如下形式:
function ff(x, b, a)
    (a+b, x)
end
function ff(x, b)
    a = b
    ff(x, b, a)
end
function ff(x)
    b = 1
    ff(x, b)
end
所以它输出和外部变量的b是无关的
如果函数定义变为
ff(x,a=b,b=1)=(a+b,x)
这个时候会变成
function ff(x, a, b)
    (a+b, x)
end
function ff(x, a)
    b = 1
    ff(x, a, b)
end
function ff(x)
    a = b
    ff(x, a)
end
这时再调用ff(3)时,因为b在函数内部没有定义,所以会从全局变量中找b,得到的结果就不一样。
如果全局没有定义b,就会出错
julia> ff(3)
ERROR: UndefVarError: b not defined