同一个函数,程序包.函数和函数有什么区别?

如题,最近看到别人的一段代码,里面同时出现了LinearAlgebra.norm()和norm()两个函数。

我知道norm()是求向量或矩阵的p阶范数的函数,LinearAlgebra.norm()貌似也是同样的功能。那为什么同一段代码里两者都会出现呢?它们之间有什么区别?

应该是实现不同,norm 如果不是 julia 的自带函数,就是他自己实现的。另一个则是包里面的。

methods(函数名)

看一下签名。

谢谢,我试了一下,methods两个后的结果竟然一模一样…会不会这两个函数实际就是同一个函数?只是作者检查代码不仔细,没有把形式统一?

如果前面写过 using LinearAlgebra 那就是一样的

是这样的,举个例子,你在REPL里写println,其实是Base里的东西,然后因为REPL的Main模块默认导入了Base,所以Main里面不加模块名字使用println这个符号,引用到的是Base.println这个方法。

小技巧:使用which宏判断某个对象属于哪个模块。

julia> @which println
Base

当然,如果你在Main里定义了一个叫做println的东西,情况就有变化了:

julia> names(Main)
4-element Array{Symbol,1}:
 :Base            
 :Core            
 :InteractiveUtils
 :Main            

julia> function println(x)
           Base.println(x+1)
       end
println (generic function with 1 method)

julia> println(1)
2

julia> @which println
Main

julia> Base.println(1)
1

julia> names(Main)
6-element Array{Symbol,1}:
 :Base            
 :Core            
 :InteractiveUtils
 :Main            
 :ans             
 :println

注意,此时Main.println和Base.println已经是两个东西了。

2 个赞

谢谢您的耐心解答,明白了。