Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby获取继承类_Ruby_Inheritance - Fatal编程技术网

Ruby获取继承类

Ruby获取继承类,ruby,inheritance,Ruby,Inheritance,我正在为rails创建我的第一个插件。我还是ruby的新手,我想知道是否有可能获得继承类 例如,我正在尝试创建一个插件,当您不使用迁移时,它将允许进行单元测试和功能测试。我试图做的是初始化一个名为controller的类变量,将其初始化为正在测试的控制器类型 如果我有一个基类ControllerTest: class ControllerTest < Test::Unit::TestCase attr_accessor :controller def initialize

我正在为rails创建我的第一个插件。我还是ruby的新手,我想知道是否有可能获得继承类

例如,我正在尝试创建一个插件,当您不使用迁移时,它将允许进行单元测试和功能测试。我试图做的是初始化一个名为controller的类变量,将其初始化为正在测试的控制器类型

如果我有一个基类ControllerTest:

class ControllerTest < Test::Unit::TestCase
  attr_accessor :controller

  def initialize
    super
    @controller = "call function that will find the inheriting classes name and create an instance of that controller type."
  end
end
因此,我目前的重点是获取继承类的名称。这可能吗?如果没有,有人知道我如何实现这一点的其他方法吗


提前感谢。

如果您希望获得当前所在班级的名称,可以使用self.class.name。如果希望获取超类,可以使用数组self.class.祖先,例如self.class.祖先[1].name。立即超类也可以作为self.superclass提供

编辑,添加示例:

class ControllerTest
  attr_accessor :controller
  def initialize
    super
    @controller = eval "#{self.class.name}Controller.new(self)"
  end
end

class Foo <ControllerTest
end
class Bar <ControllerTest
end

class Controller
  def initialize (o)
    puts "Created #{self.class} to control #{o.class.name}"
  end
end

class FooController <Controller
end
class BarController <Controller
end

foo = Foo.new
bar = Bar.new

非常简单:使用继承的回调

从类的RDoc: inheritedsubclass:在创建当前类的子类时调用回调

例如:

   class Foo
      def self.inherited(subclass)
         puts "New subclass: #{subclass}"
      end
   end

   class Bar < Foo
   end

   class Baz < Bar
   end
produces:

   New subclass: Bar
   New subclass: Baz

我相信你需要抓住类的定义

从类的RDoc:

inherited(subclass)
Callback invoked whenever a subclass of the current class is created.

Example:

   class Foo
      def self.inherited(subclass)
         puts "New subclass: #{subclass}"
      end
   end

   class Bar < Foo
   end

   class Baz < Bar
   end
produces:

   New subclass: Bar
   New subclass: Baz

这将只列出当前类中的实例方法

self.class.new.methods-self.class.concedens[1].new.methods

和通用解决方案 c=某类

c、 new.methods-c.concedens[1]。new.methods


重复了先前发布的相同答案。当我开始发布此答案时,您的答案不在那里。如果你被冒犯了,很抱歉,但直到我发布了我的答案,我才看到你的答案。@fig gnuton:由于OP接受了我的答案,你对“不回答问题”的否决票似乎有点不正确。哈哈,你的选择还是比较差的。OP显然不知道如何选择答案@fig gnuton:OP选择了唯一一个符合他问题中的代码示例的答案。你和其他许多海报在结尾处对公认的含糊不清措辞的解释并没有改变OP的提问意图。因此,即使你的答案对你认为他提出的问题完全有效,这只是意味着这个问题可能不是每个人都很清楚,但它得到了一个可以接受的答案。当然,你可以为OP的代码的不同设计辩护,并修改你的答案,以说明这个解决方案可以如何取代它,但现在它不会导致“@controller被初始化为正在测试的控制器类型”。展示如何使用它,比否决这个问题和对它的各种不同解释更有建设性……我不同意。考虑到文章标题和问题本身(包括代码示例)的措辞,您的选择仍然很糟糕。为了将来参考,最简单的方法就是使用继承的回调。@fig gnuton:如果是,发布示例以完成相同的任务=基于使用该类的继承类的名称获取特定类型的控制器;这实际上对以后发现这个问题的人很有帮助,实际上是想问如何使用继承回调,而不是这个问题是关于什么的;诚然,对问题的解释存在分歧,但本答案中的代码按照提问者的意图工作并回答问题。如果答案没有回答其他问题,那就不是它的错。
inherited(subclass)
Callback invoked whenever a subclass of the current class is created.

Example:

   class Foo
      def self.inherited(subclass)
         puts "New subclass: #{subclass}"
      end
   end

   class Bar < Foo
   end

   class Baz < Bar
   end
produces:

   New subclass: Bar
   New subclass: Baz