为什么' class' show' Class'什么时候祖先。包括?类'是' false'?

时间:2018-05-08 01:00:52

标签: ruby-on-rails ruby

我有一个继承自ApplicationRecord的类User。当我选中User.ancestors.include?(Class)时,结果为false,但对于User.class,结果为Class

在这种情况下,class方法提供的信息的用例是什么?它真正告诉我实际用途是什么?它似乎与继承无关。

4 个答案:

答案 0 :(得分:2)

User是一个班级。所有类都是类Class的实例(即User.class #=> Class)。因此,可以在Class上调用在ClassUser的祖先上定义的所有实例方法(即,Class的每个实例方法都是User)的类方法。

例如,Class的一个实例方法是instance_methods。因此,可以执行User.instance_methods以获取User实例方法的数组。

答案 1 :(得分:2)

  

在这种情况下,类方法提供的信息的用例是什么?它真正告诉我实际用途是什么?它似乎与继承无关。

class对每个对象的工作方式相同。在类上调用class提供的信息与在实例上调用class相同。那是因为在Ruby中,类也是实例。

'foo'.class返回String,因为'foo'String的实例。同样,User.class会返回Class,因为UserClass的实例。

特别是,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)。 classObject的实例方法。它返回对象的类。因此,User.class会返回Class。每个对象都有这个方法,知道对象是什么(例如,用于调试)是很有用的。请考虑以下代码:

1.class
# => Fixnum
"q".class
# => String

User.ancestors未返回Class的原因是因为它返回module中包含的模块。例如,Class.ancestors将包含Class,但不包括User,因为UserClass的对象,其中包含自己的模块。

答案 3 :(得分:1)

在阅读了另一个StackOverflow post之后,我意识到只有牢记以下内容才能理解它:

  1. User班级有双重角色。它扮演Class和Object。
    • 作为Class,它允许其他类继承它。
    • 作为Object,它从Object类继承了类方法。
  2. 如果我希望我的User.class在传统行上行事(即User.class显示ApplicationRecord),那么我必须覆盖 它如下:

    class User def self.class self.superclass end end