看文档没看太明白,有无大佬通俗解释一下using和import的区别?
这个主要看使用场景。
调包
调包用 using 更多,using 会将模块中 export
的符号导入到当前环境,比如
using BenchmarkTools
@btime a=1
用 import 则不会导入这些符号,得用 模块名.变量
的方式调用函数,否则报错 变量名未定义
# using 不支持 using xxx as yyy 的方式
import BenchmarkTools as bt
bt.@btime a=1
对于没有被 export
的变量,用 import/using
效果一样。
另外,遇到变量名冲突时,比如使用不同模块的同名函数,就得用 import 来导入,然后用 module1.xxx, module2.xxx
的方式来使用这些函数。
修改模块
外部修改模块一般用 import 而不是 using,用 using 的话得用 module.xxx
的方式,比如
using BenchmarkTools
# 源码 export 了符号 `warmup`
# 为函数 warmup 添加派发
warmup(::Int) = true ## 报错
BenchmarkTools.warmup(::Int) = true # 正常,但不建议
用 import 的写法为
import BenchmarkTools: warmup
warmup(::Int) = true
个人使用场景:
重载 Base 运算符的时候用 import
,比如
import Base: length, +, -, *, ÷
struct Point;coord::AbstractVector;end
+(p::Point, q::Point) = Point(p.coord + q.coord)
测试模块函数,或者调包时用 using,比如
using xxx: func1, func2
@test func1(xx) == func2(xx)
另外,using 和 import 好像不支持 import all/*
之类的操作。
原来如此啊!谢谢!
怎么看一个包的export
的变量有哪些?
用 @edit
查看源码。
按 Julia 包的命名规范,模块 src
目录下需要有同名文件,比如 BenchmarkTools
在 BenchmarkTools.jl
中可以找到被 export
的内容。
btw, @edit
默认用 vim 查看文件,可以设置 ENV["EDITOR"] = "code"
指定 vscode.
您好,我有几个疑问:
- 1 @edit 查看某个函数源码的时候,需要加参数,这有两个问题,首先我要查看,很可能我不知道具体的参数形式,其次,我还得构建出对应的参数变量,才能正常运行,那如果我对这个函数不太了解的话,有没有更好的方式查看源码?
- 2 我在另一本书上看到说,使用using 导入包后,对于已经export的函数可直接使用函数名,对于未export的变量,可以使用限定名.变量名的方式,这个应该也可以吧?
- 3 using 和 import这些方式,跟include有什么区别呢?
- 可以用
methods
获取所有方法,用functionloc
获取源代码位置 - 是
- include 相当于打开文件,把文件内容复制黏贴在 include 所在位置,不能指定模块名
感谢!
关于1 还是有点疑惑,先使用methods方法确实能让我get有哪些参数,我刚刚才想到。但问题是我还是得自己先构建对应类型的参数吧?我感觉就这个不太方便,显然我对方法本身都不了解,咋个去构建对应的变量呢?能不能以show函数为例讲一下?(虽然这种需求一般都用在一些没有好好写文档的第三方包上,或者也可以以其他的举个例子)
不同派发的源码可能在不同位置,最常见比如 length
和运算符,许多包都会为新定义的数据类型对这些函数添加新派发。
所以要明确指向某一派发,才能用 @edit
查看。
如果在阅读别人代码遇到的函数,vscode 下 ctrl 单击就能跳到源码。
如果自己在用,输入没搞懂,看源码意义也不大吧。
如果只是单纯翻源码,也可以到对应包里检索。
show文档写得很清楚了,也没必要单纯为了知道而知道,无限套娃。。。在实战中遇到需求更有学习价值。
推荐的交流模式:我在做什么,遇到了啥,做了哪些尝试,搜索。