class << selfRuby中做什么?

推荐答案

首先,class << foo语法打开了foo的单例类(eigenclass).这允许您专门研究在特定对象上调用的方法的行为.

a = 'foo'
class << a
  def inspect
    '"bar"'
  end
end
a.inspect   # => "bar"

a = 'foo'   # new object, new singleton class
a.inspect   # => "foo"

现在,为了回答这个问题:class << self打开了self的单例类,因此可以为当前self对象(在类或模块主体中是类或模块itself)重新定义方法.通常,这用于定义类/模块("静态")方法:

class String
  class << self
    def value_of obj
      obj.to_s
    end
  end
end

String.value_of 42   # => "42"

这也可以简写为:

class String
  def self.value_of obj
    obj.to_s
  end
end

甚至更短:

def String.value_of obj
  obj.to_s
end

在函数定义中,self指的是调用函数的对象.在这种情况下,class << self打开该对象的单例类;它的一个用途是实现穷人的状态机:

class StateMachineExample
  def process obj
    process_hook obj
  end

private
  def process_state_1 obj
    # ...
    class << self
      alias process_hook process_state_2
    end
  end

  def process_state_2 obj
    # ...
    class << self
      alias process_hook process_state_1
    end
  end

  # Set up initial state
  alias process_hook process_state_1
end

因此,在上面的示例中,StateMachineExample的每个实例都将process_hook别名为process_state_1,但请注意,在后者中,它如何将process_hook(仅适用于self,不影响其他StateMachineExample个实例)重新定义为process_state_2.因此,每次调用方调用process方法(调用可重新定义的process_hook)时,行为都会根据其所处的状态而变化.

Ruby相关问答推荐

带有(*)签名的Ruby方法

以编程方式获得完整的 Ruby 版本?

给url添加参数

为什么 ruby​​ 在 Windows 上这么慢?

截断、事务和删除数据库策略的区别

Scala 的扩展性是否优于其他 JVM 语言?

如何正确截断表格?

Ruby 中的 -> (stab) 运算符是什么?

如何在Ruby中获取终端窗口的宽度

Ruby中的常量或类变量?

就地修改 ruby​​ 哈希(rails strong params)

Ruby 与计算机科学相关的 yield 特性

如何按字母顺序排列忽略大小写的数组?

为什么显式返回会对 Proc 产生影响?

如何只获取没有命名空间的类名

哪个键/值存储最有前途/最稳定?

如何在 Ruby 中获取堆栈跟踪对象?

找不到Bundle 命令 mac

什么是 Rakefile?

Ruby:如何计算一个字符串在另一个字符串中出现的次数?