我正在阅读另一个 SO 问题 Enums in Ruby它有以下代码片段:
class Enum
private
def self.enum_attr(name, num)
name = name.to_s
define_method(name + '?') do
@attrs & num != 0
end
define_method(name + '=') do |set|
if set
@attrs |= num
else
@attrs &= ~num
end
end
end
public
def initialize(attrs = 0)
@attrs = attrs
end
def to_i
@attrs
end
end
据我了解,这是在定义一个名为 enum_attr
的类方法,对吗?我不确定在 enum_attr
方法中包含 define_method
语句意味着什么。
然后在那篇文章的后面,它显示了类被扩展如下
class FileAttributes < Enum
enum_attr :readonly, 0x0001
enum_attr :hidden, 0x0002
end
我不太明白第二部分的作用 - 谁能解释一下?
最佳答案
在Enum
,一种方法,enum_attr
, 是在类的单例上定义的,并且可用于所有子类。此方法在类定义主体的范围内,并且在 FileAttributes
中使用参数 :readonly, 0x0001
调用它然后 :hidden, 0x0002
.
当 enum_attr
被调用(让我们只看第一个调用,enum_attr :readonly, 0x0001
),它定义了两个方法:readonly?
& readonly=(set)
. enum_attr
的调用结果在功能上等同于在 FileAttributes
中写出以下内容:
def readonly?
@attrs & 0x0001 != 0
end
def readonly=(set)
if set
@attrs |= 0x0001
else
@attrs &= ~0x0001
end
end
由于 block 传递给 define_method
是一个闭包,变量num
当您调用已定义的方法时,来自传递 block 的范围仍在范围内。换句话说,num
传递给 enum_attr
的变量在生成的方法中仍然可用 readonly?
& readonly=
稍后从不同的范围调用它们时。
define_method
必须使用,因为方法的名称是动态生成的(即,我们提前不知道方法的名称)。
关于ruby 理解枚举方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11181952/