在创建课程时,我们使用关键字class
,如:
class Abc
Z = 5
def add
puts "anything here"
end
end
在控制台中,Abc.class # => Class
Abc
内部如何成为一个班级? class
和Class
之间有什么区别?
如果有人能够解释如何在内部调用类常量和方法,并且如果没有定义方法,那么我们将如何获得异常"undefined class method"
。它背后的内在逻辑是什么?
答案 0 :(得分:14)
这里有三种不同的东西:
class
是一个关键字,用于定义或重新打开类Object#class
是一个方法,它返回给定对象的类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。
至于如何查找方法:
方法可以来自多个地方:
查找顺序如下:
这里有一些事情需要注意:
BasicObject
)找不到方法,再次搜索祖先链以寻找另一种方法,称为method_missing
BasicObject#method_missing
已定义为抛出NoMethodError
,而错误来自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更喜欢后者,因为它将所有类方法保存在单个块中,但它们是等效的。