代码之家  ›  专栏  ›  技术社区  ›  kapso

Ruby类问题[重复]

  •  4
  • kapso  · 技术社区  · 14 年前

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

    我有个很快的鲁比问题。我来自一个Java/C背景,所以我在Ruby“自我”中理解,当一个实例方法中引用时,它的作用类似于“这个”。方法的前缀“self”将其定义为类方法。

    但这意味着什么??

    class << self
      def some_method
      end
    end
    
    4 回复  |  直到 14 年前
        1
  •  4
  •   Jordan Running    14 年前

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

    它相当于这样做:

    my_obj = MyClass.new
    
    class << my_obj
      def some_method
      end
    end
    
    # or...
    
    def my_obj.some_method
    end
    

    下面是一篇很好的文章: Learning Ruby: class << self .

        2
  •  1
  •   Chuck    14 年前

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

    例如:

    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表示类对象本身)。

        3
  •  0
  •   Bayard Randel    14 年前

    这就是如何为对象的singleton/eigen类定义方法。

    class << foo
      def bar
      end
    end
    

    等于

    def foo.bar
    end
    
        4
  •  -1
  •   Sniggerfardimungus    14 年前

    如果您这样使用它:

    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
    

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