检查子类是否是父类的实例

Can*_*yer 0 ruby ruby-on-rails

我有以下三个类:

class MessageBuilder
   def initialize(template)
       @template = template
       puts @template.instance_of? MessengerTemplate 
   end
end

class MessengerTemplate
    def initialize
        @default_template_id = "111111"
    end
end

class JobTemplate < MessengerTemplate
    def initialize(name)
        @name = name
        @template_id = "2222"
    end
end
Run Code Online (Sandbox Code Playgroud)

我正在尝试检查传递给的参数是否MessageBuilder#initializeMessengerTemplate. 如果没有,我需要抛出一个错误。

当我打电话时:

message = MessageBuilder.new(JobTemplate.new("Invoice"))
Run Code Online (Sandbox Code Playgroud)

构造函数中的以下行:

puts @template.instance_of? MessengerTemplate
Run Code Online (Sandbox Code Playgroud)

打印FALSE

有人可以告诉我我在这里做错了什么吗?

jvi*_*ian 5

尝试:

@template.is_a?(MessengerTemplate)
Run Code Online (Sandbox Code Playgroud)

文档中所述:

如果classobj的类,或者classobjobj 中包含的模块的超类之一,则返回 true 。

MessengerTemplate是 的超类@template,因此@template.is_a?(MessengerTemplate) => true

  • ...或`@template.class &lt;= MessengerTemplate` 或`MessengerTemplate === @template`。请参阅 [模块#&lt;=](http://ruby-doc.org/core-2.4.0/Module.html#method-i-3C-3D) 和 [模块#===](http:// ruby-doc.org/core-2.4.0/Module.html#method-i-3D-3D-3D)。 (2认同)