8.5 导出与可见性
1. Ruby
源文件被require后, 其中的局部变量是源文件外不可见的, 其他(常量, 全局变量)是可见的.
(面向对象)类有可见性控制
public
protected
可以继承,只能在类内部访问,可以指定接收对象private
可以继承,只能在类内部访问,不能指定接收对象(只能隐式使用self)
2. Node.js
Node利用包装函数进行模块加载, 包装函数的其中2个形参是exports
module
. exports 是导出内容, module代表当前模块, exports是module的属性.
因为包装函数的存在, 模块中原来的顶层变量变成了包装函数中的局部变量, 在模块外不可见, 这样有效地实现了命名空间的隔离.
在引入模块中, 创建一个和被引入模块名称一样的局部变量, 是一种惯例, 如 var http = require("http");
不要直接给exports赋值, 因为exports是一个形参, 直接赋值形参会改变形参的引用,但是不能改变作用域外的值, 迂回方案是给module.exports
直接赋值.
3. Go
所有成员本包内可见, 无论是否在同一源文件
首字母大写成员包外可见(导出成员)
适用于包内全局变量, 全局常量, 类型, 结构字段, 函数, 方法等
内部包(在internal目录下的包): 仅可以被该包父目录下的包访问
嵌入类型的字段或者属性, 不受嵌入类型本身可见性影响:
type Admin struct { user // 嵌入不可见类型 } type user struct { // 不可见 Name string // 可见的属性 } a := Admin{"zhongfox"} a.Name // 在包外可以访问
4. Lua
源文件(模块)被require后, 其中的局部变量是源文件外不可见的, 全局变量是模块外可见.
源文件(模块)被require后, 可以通过return 导出.