我有一个继承自ApplicationRecord的类User
。当我选中User.ancestors.include?(Class)
时,结果为false
,但对于User.class
,结果为Class
。
在这种情况下,class
方法提供的信息的用例是什么?它真正告诉我实际用途是什么?它似乎与继承无关。
答案 0 :(得分:2)
User
是一个班级。所有类都是类Class
的实例(即User.class #=> Class
)。因此,可以在Class
上调用在Class
或User
的祖先上定义的所有实例方法(即,Class
的每个实例方法都是User
)的类方法。
例如,Class
的一个实例方法是instance_methods
。因此,可以执行User.instance_methods
以获取User
实例方法的数组。
答案 1 :(得分:2)
在这种情况下,类方法提供的信息的用例是什么?它真正告诉我实际用途是什么?它似乎与继承无关。
class
对每个对象的工作方式相同。在类上调用class
提供的信息与在实例上调用class
相同。那是因为在Ruby中,类也是实例。
'foo'.class
返回String
,因为'foo'
是String
的实例。同样,User.class
会返回Class
,因为User
是Class
的实例。
特别是,User
不是 ApplicationRecord
的实例。
User
通过class
关键字创建Class
的实例可能并不明显:
class User < ApplicationRecord; end
但是当你通过Class.new
显式地创建它时,它变得非常明显:(两个例子产生相同的结果)
User = Class.new(ApplicationRecord)
User.class #=> Class
因为上述内容如下:(使用String.new
进行演示)
foo = String.new('foo')
foo.class #=> String
答案 2 :(得分:1)
Ruby中的类是第一类对象 - 每个对象都是类的实例
Class
User
是类Class
的对象(继承自Object
)。
class是Object
的实例方法。它返回对象的类。因此,User.class
会返回Class
。每个对象都有这个方法,知道对象是什么(例如,用于调试)是很有用的。请考虑以下代码:
1.class
# => Fixnum
"q".class
# => String
User.ancestors
未返回Class
的原因是因为它返回module
中包含的模块。例如,Class.ancestors
将包含Class
,但不包括User
,因为User
是Class
的对象,其中包含自己的模块。
答案 3 :(得分:1)
在阅读了另一个StackOverflow post之后,我意识到只有牢记以下内容才能理解它:
User
班级有双重角色。它扮演Class和Object。
如果我希望我的User.class
在传统行上行事(即User.class
显示ApplicationRecord
),那么我必须覆盖
它如下:
class User
def self.class
self.superclass
end
end