ruby 理解枚举方法

标签 ruby metaprogramming

我正在阅读另一个 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/

相关文章:

ruby - 模式匹配时 =~ 和 match() 有什么区别?

javascript - 在 Rails 中提交表单,无需重新加载页面

ruby - 向 ruby​​ 中的多个类添加方法

c++ - 将 QVariant 中的枚举转换为整数

ruby-on-rails - ActionController::UrlGenerationError:没有自定义路由的路由匹配

ruby - 使用 Padrino、Sass 和 Slim 从布局链接到 CSS

ruby - `DateTime.strptime` 返回工作日/时间字符串的无效日期

ruby-on-rails - 将 block 传递给动态创建的方法

c++ 容器容器的通用 `flatten`

python - 如何配置 pytest 在生成测试时生成有用的名称?