Ruby中self.call与self.[]方法作用解析及Mine::Container.()调用结果咨询
Ruby代码解析:Mine::Container类的方法详解
嘿,作为从NodeJS转Ruby的开发者,刚接触这种Ruby特有的语法确实会有点摸不着头脑,我来一步步帮你拆解这段代码的逻辑~
先整体看一下这个类
这段代码定义了一个命名空间Mine下的Container类,核心是两个类方法:self.call和self.[],用来管理一组容器实例。
1. self.call 方法的作用
这是一个类方法(Ruby里用self.开头的方法属于类本身,相当于NodeJS里的静态方法),代码逻辑很简单:
def self.call @containers || {} end
@containers是类实例变量,它属于Mine::Container这个类本身,而不是类的某个实例。||是逻辑或运算符,这里的意思是:如果@containers已经有值(之前被初始化过),就返回它;如果@containers是nil(还没被初始化),就返回一个空哈希{}。- 注意:这个方法不会主动初始化
@containers,只是返回一个默认值。
2. self.[] 方法的具体作用
这是Ruby里的特殊语法方法,定义它之后,你可以用Mine::Container[namespace]这种类似数组/哈希索引的方式调用它,相当于给类加了一个“索引访问”的能力,NodeJS里没有直接对应的语法,但可以理解为一个专门的静态get方法。
代码逻辑:
def self.[](namespace) @containers ||= Hash.new{|h, k| h[k] = new } @containers[namespace] end
- 第一行
@containers ||= Hash.new{|h, k| h[k] = new }:||=是“条件赋值”运算符,意思是如果@containers不存在(为nil),就把它初始化为一个特殊的哈希。- 这个哈希用了块初始化:
Hash.new{|h, k| h[k] = new },当你访问一个哈希里不存在的key(也就是这里的namespace)时,会自动执行这个块:创建一个Mine::Container的新实例,把它赋值给这个key,然后返回这个实例。简单说就是“访问不存在的命名空间时自动创建对应实例”。
- 第二行
@containers[namespace]:返回对应命名空间的容器实例——如果之前访问过这个命名空间,直接返回已有的实例;如果没访问过,就触发上面的块创建新实例后再返回。
3. Mine::Container.() 会返回什么?
Ruby里有个语法糖:obj.()等价于调用obj.call方法,所以Mine::Container.()就是在调用Mine::Container.call。
它的返回值分两种情况:
- 如果之前调用过
Mine::Container[some_namespace]:此时@containers已经被初始化为那个带自动创建逻辑的哈希,call方法会返回这个哈希(里面包含所有已经被访问过的命名空间对应的Mine::Container实例)。 - 如果之前从未调用过
[]方法:@containers还是nil,call方法会直接返回一个空哈希{}。
内容的提问来源于stack exchange,提问作者Nishkarsh Kumar
相关产品推荐
相关产品推荐

