Ruby module 共享变量

littlell · 2014年03月14日 · 最后由 littlell 回复于 2014年03月14日 · 2378 次阅读

一个 gem 中有若干个 module,

Module1::Child1
Module1::Child2
Module1::Child3

如何在这个 gem 中定义一个值 Cons,让三个子 module 共享,这样就可以让任何一个子模块(Child1,Child2,Child3)用于 mixin 的时候,都可以使用这个值 Cons. 比如:

class c1
include Module1::Child1
end
class c2
include Module1::Child2
end

让 c1 和 c2 都能拥有 Cons 这个值。

创建一个 singleton 对象,3 个模块添加类 accessor

最好不要定义变量 (类似@@foomaccessor),这个是有气味的,特别是在好几个模块都可以读取的情况下。Thread unsafe.

可以定义为常数或 module method,只读。

如果子模块都要读取,最好放在module1

如果一定要可写的变量,比较好的方法是做一个 class 来包裹,每个其他模块读取都建立一个新的 instance, 这样互不干扰。

#2 楼 @billy 需求为只读,已通过定义常数实现,在 moule1 中定义,如下:

Module1
Cons = 1
end
Module1::Child1
end

这样是可以滴

#1 楼 @windwiny singleton 对象是在 Module1 中定义呗?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号