4

可能重复:
Ruby 中的 class << self idiom

我有一个快速的 Ruby 问题。我来自 Java/c 背景,所以当在实例方法中引用时,我理解 Ruby 中的“self”就像“this”。还有“自己”。方法的前缀将其定义为类方法。

但这意味着什么?

class << self
  def some_method
  end
end
4

4 回答 4

4

这里发生的事情是,我们正在从自身内部重新打开一个对象的类并在其上定义一个新的实例方法。这是在 Ruby 中进行所谓的“猴子修补”的方法之一。此方法仅将方法添加到当前对象而不是类的所有对象。

这相当于这样做:

my_obj = MyClass.new

class << my_obj
  def some_method
  end
end

# or...

def my_obj.some_method
end

这是一篇很好的文章:Learning Ruby: class << self

于 2010-07-27T23:10:25.550 回答
1

语法class << some_objct打开了some_object的单例类,这是一个特殊的“秘密”类,只有该对象属于。使用单例类,您可以定义一个对象响应而其普通类的其他实例不响应的方法。

因此,例如:

a = "Hello world"
b = "Hello world" # Note that this is a different String object

class << a
  def first_letter
    self[0,1]
  end
end

puts a.first_letter # prints "H"
puts b.first_letter # Raises an error because b doesn't have that method

在类上下文中,这两个方法定义是等价的:

class Foo
  def self.bar
    puts "Yo dawg"
  end
end

class Foo
  class << self
    def bar
      puts "Yo dawg"
    end
  end
end

第二种形式在某些情况下可能很有用(例如,当您想attr_accessor为类对象本身声明 s 时)。

于 2010-07-27T23:22:57.113 回答
0

这是您为对象的单例/特征类定义方法的方式。

class << foo
  def bar
  end
end

相当于

def foo.bar
end
于 2010-07-27T23:11:44.110 回答
-1

如果你像这样使用它:

class Foo
    class << self
        def something
            puts "something"
        end
        def something_else
            puts "something else"
        end
    end
end

Foo.something

它是以下的简写:

class Foo
    def self.something
        puts "something"
    end
    def self.something_else
        puts "something else"
    end
end

我不喜欢这种符号,真的。

于 2010-07-27T23:11:25.373 回答