`Class`和`class`有什么区别

时间:2015-09-16 06:32:25

标签: ruby

在创建课程时,我们使用关键字class,如:

class Abc
  Z = 5
  def add
    puts "anything here"
  end
end

在控制台中,Abc.class # => Class

Abc内部如何成为一个班级? classClass之间有什么区别?

如果有人能够解释如何在内部调用类常量和方法,并且如果没有定义方法,那么我们将如何获得异常"undefined class method"。它背后的内在逻辑是什么?

5 个答案:

答案 0 :(得分:14)

这里有三种不同的东西:

  1. class是一个关键字,用于定义或重新打开类
  2. Object#class是一个方法,它返回给定对象的类
  3. Class是所有类都是其实例的类(包括Class本身)

答案 1 :(得分:2)

ndn's answer概述了不同的东西" class"可以参考。

回答您的具体问题:

  

Abc内部如何成为一个班级?

几乎和其他任何物体一样。

class Abc
end

相当于:

Abc = Class.new do
end

它会创建Class的新实例,并将其分配给常量Abc

答案 2 :(得分:1)

使用class Abc定义一个类。

Abc.class正在返回类型,而Abc的类型是Class

另一个例子:

1337.class
=> Fixnum
"hi babe!".class
=> String
12.55.class
=> Float
(1..12).class
=> Range

如您所见,每个“数据类型”都是一个类。在您的情况下Abc也是一种数据类型。而对于该链的末尾,类的类是Class! : - )

答案 3 :(得分:1)

要查看Ruby中不同的" class" 内容,请查看my other answer

至于如何查找方法:

方法可以来自多个地方:

  1. 对象的类
  2. 对象类的父级
  3. 包含/预置的模块
  4. 对象的单例类
  5. 查找顺序如下:

    1. 如果存在,则为单件类
    2. 前置模块
    3. 班级
    4. 中定义的方法
    5. 包含的模块
    6. 递归地,上述父类的规则
    7. 这里有一些事情需要注意:

      1. 如果包含/预先添加了多个模块,将按照它们被包含/预置的相反顺序进行查找
      2. 如果某个模块已经包含/预先安装在其中一个parrents中,那么它将不会被包含/重新加入
      3. 如果使用这些规则,则在层次结构的最开始(BasicObject)找不到方法,再次搜索祖先链以寻找另一种方法,称为method_missing
      4. BasicObject#method_missing已定义为抛出NoMethodError,而错误来自
      5. module M1
          def foo
            puts 'Defined in M1'
          end
        end
        
        module M2
          def foo
            puts 'Defined in M2'
          end
        end
        
        class C
          include M1
          prepend M2
        
          def foo
            puts 'Defined in C'
          end
        
          def method_missing(method_name)
            puts 'Method missing' if method_name == :foo
          end
        end
        
        c = C.new
        
        # singleton method
        def c.foo
          puts "Defined in c's singleton"
        end
        
        puts c.singleton_class.ancestors
          # => [#<Class:#<C:0xa2d0f8>>, M2, C, M1, Object, Kernel, BasicObject]
          #     ^ the singleton class,
          #       the prepended module,
          #       the C class itself,
          #       the included module,
          #       the rest of the hierarchy
          # (Object is the implicit parent of all classes with no explicit parent)
        

答案 4 :(得分:0)

回答第二个问题,undefined class method发生在你调用的方法不存在于这样的类中时 - 类只是Ruby中的对象,因此它们有自己的一组方法。 Ruby有几种定义类方法的方法,最常见的可能是

class Klass
  def self.klass_method
    ...
  end
end

另一个是

class Klass
  #  some ordinary instance methods here
  class << self
    def klass_method
      # this is class method
    end
  end
end

有些Rubyist更喜欢后者,因为它将所有类方法保存在单个块中,但它们是等效的。