求教using和import的区别

看文档没看太明白,有无大佬通俗解释一下using和import的区别?

2 个赞

这个主要看使用场景。

调包

调包用 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/* 之类的操作。

5 个赞

原来如此啊!谢谢!

怎么看一个包的export 的变量有哪些?

@edit 查看源码。
按 Julia 包的命名规范,模块 src 目录下需要有同名文件,比如 BenchmarkTools

BenchmarkTools.jl 中可以找到被 export 的内容。


btw, @edit 默认用 vim 查看文件,可以设置 ENV["EDITOR"] = "code" 指定 vscode.

2 个赞

您好,我有几个疑问:

  • 1 @edit 查看某个函数源码的时候,需要加参数,这有两个问题,首先我要查看,很可能我不知道具体的参数形式,其次,我还得构建出对应的参数变量,才能正常运行,那如果我对这个函数不太了解的话,有没有更好的方式查看源码?
  • 2 我在另一本书上看到说,使用using 导入包后,对于已经export的函数可直接使用函数名,对于未export的变量,可以使用限定名.变量名的方式,这个应该也可以吧?
  • 3 using 和 import这些方式,跟include有什么区别呢?
  1. 可以用 methods 获取所有方法,用 functionloc 获取源代码位置
  2. include 相当于打开文件,把文件内容复制黏贴在 include 所在位置,不能指定模块名

感谢!
关于1 还是有点疑惑,先使用methods方法确实能让我get有哪些参数,我刚刚才想到。但问题是我还是得自己先构建对应类型的参数吧?我感觉就这个不太方便,显然我对方法本身都不了解,咋个去构建对应的变量呢?能不能以show函数为例讲一下?(虽然这种需求一般都用在一些没有好好写文档的第三方包上,或者也可以以其他的举个例子)

1 个赞

不同派发的源码可能在不同位置,最常见比如 length 和运算符,许多包都会为新定义的数据类型对这些函数添加新派发。

所以要明确指向某一派发,才能用 @edit 查看。

如果在阅读别人代码遇到的函数,vscode 下 ctrl 单击就能跳到源码。
如果自己在用,输入没搞懂,看源码意义也不大吧。
如果只是单纯翻源码,也可以到对应包里检索。

show文档写得很清楚了,也没必要单纯为了知道而知道,无限套娃。。。在实战中遇到需求更有学习价值。
推荐的交流模式:我在做什么,遇到了啥,做了哪些尝试,搜索。