Ruby类问题[重复]

Posted

技术标签:

【中文标题】Ruby类问题[重复]【英文标题】:Ruby class question [duplicate] 【发布时间】:2011-03-21 21:25:37 【问题描述】:

可能重复:class << self idiom in Ruby

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

但这在这里意味着什么??

class << self
  def some_method
  end
end

【问题讨论】:

【参考方案1】:

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

相当于这样做:

my_obj = MyClass.new

class << my_obj
  def some_method
  end
end

# or...

def my_obj.some_method
end

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

【讨论】:

OscarRyz:调用代码的实例。 我认为这个答案应该更明确地谈论单例类或特征类。 “从内部重新打开一个对象的类”太模糊了,使用的“类”这个词并不能清楚地表明该类是单例类,而不仅仅是通过 obj.class 返回的类【参考方案2】:

class &lt;&lt; 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_accessors 时)。

【讨论】:

【参考方案3】:

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

class << foo
  def bar
  end
end

等价于

def foo.bar
end

【讨论】:

【参考方案4】:

如果你这样使用它:

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

我真的不喜欢这种符号。

【讨论】:

不是 self.* 类方法,但看到上面的其他解释似乎“类 这根本不是“速记”。如果有的话,您的后一种语法是前者的一种简写。 class &lt;&lt; self 打开对象的 eigenclass,不仅可以用于定义方法。 如果您要添加大量类变量,这只是简写。我把这个观察作为练习留给读者,我想他们会认为这不是他们应该做的事情,除非他们有一个该死的充分理由。他们没有。 =]

以上是关于Ruby类问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Ruby map 方法语法问题[重复]

冒号的意义:在Ruby中[重复]

||= 在Ruby中做了啥[重复]

Ruby - 解密使用:[重复]

找出每个循环中的当前索引(Ruby)[重复]

ruby - uniq 有啥区别!和 uniq [重复]