Julia Pluto笔记本中匿名函数无法识别外部包的问题咨询
在Pluto笔记本中解决匿名函数调用包导出符号的问题
问题原因
Pluto笔记本的单元格是独立作用域,且会进行依赖分析:只有单元格内直接显式引用的符号,才会被纳入当前作用域。当匿名函数中使用Bernoulli但当前单元格没有其他地方直接引用该符号时,Pluto不会将Distributions导出的Bernoulli导入到这个单元格的作用域,导致匿名函数执行时触发UndefVarError。而普通Julia终端是全局作用域,using Distributions后全局环境已包含该符号,因此不会报错。
解决方法
方法1:在单元格内显式引用目标符号
在单元格里添加一行对Bernoulli的直接引用,让Pluto的依赖分析检测到这个符号,从而导入它:
begin Bernoulli # 仅显式引用,无需调用 g = x -> rand(Bernoulli()) @show g(1) end
方法2:使用包全称限定符号
直接用Distributions.Bernoulli代替Bernoulli,绕过作用域导入的问题:
begin g = x -> rand(Distributions.Bernoulli()) @show g(1) end
方法3:在当前单元格重新导入目标符号
在单元格开头显式导入Bernoulli(或重新using Distributions):
begin using Distributions: Bernoulli g = x -> rand(Bernoulli()) @show g(1) end
内容的提问来源于stack exchange,提问作者Allok
相关产品推荐
相关产品推荐

