繁体   English   中英

如何在Ruby中调用类的所有实例方法?

How to invoke all instance methods of a class in Ruby?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我目前正在努力将自己的小测试方法运行器脚本放在一起。

我需要某种方法来调用类中的所有方法。 当我调用run_tests方法时,我的程序陷入了无限循环。 是什么原因造成的,有什么解决方案?

class FadTest < SeleniumTest
  def can_open_page
    @driver.get(@base_url + "/")
    wait_element_present(:link, "DOCTORS")
    @driver.find_element(:link, "DOCTORS").click
    puts "page opened"
  end

  def test_method
    puts "it works"
  end

  def run_tests
    klass = self.class
    klass.instance_methods(false).each do |method|
      klass.instance_method(method).bind(self).call
    end
  end 
end
1 个回复

如Wand Maker所述run_tests涉及递归。 您的代码通过以下方式执行:

  1. 查找某个对象的类
  2. 调用SomeClass.instance_methods.each {}
  3. 一旦达到run_tests ,就可以重新开始迭代。
  4. 无限循环-您永远无法达到其余的实例方法。

我不确定您如何设计测试,因此这里有一些解决问题的方法

如果所有测试对象都具有FadTest类,则可以在迭代中编辑逻辑,我的首选解决方案是Tin Man建议的解决方案

klass.instance_methods(false).each do |method|
  next if method == :run_tests
  # ...
end

唯一的问题是您仍在扫描:run_tests元素。 如果您想保持完整的证明,而在数组中没有:run_tests ,可以尝试Cary Swoveland的建议

(klass.instance_methods(false) - [:run_tests]).each {}

如果被测试对象的类不是 FadTest ,那么我建议重写该方法。

def self.run_tests(object)
  klass = object.class
  klass.instance_methods(false).each {}
end

FadTest.run_tests(some_object)
4 如何在Ruby中从另一个类中调用一个实例方法?

我正在尝试学习Ruby,并且试图从另一个实例调用一个实例方法。 我的代码如下: 我正在尝试计算单词在给定字符串中出现的次数。 我为此使用实例方法calculate_word_frequency 。 当我注释掉对calculate_word_frequency的调用时,代码运行良好 ...

2015-10-25 18:21:42 3 99   ruby
5 ruby - 如何在模块中动态调用实例方法

我正在尝试动态调用实例方法。 我发现send , call , eval这样做。 有动态调用类方法的例子,但我还没有弄清楚如何让它适用于实例方法。 例如 实例方法名称可以列出: 但我无法弄清楚如何调用该方法: 如何通过方法名称调用实例方法,如Foo ? ...

2017-04-20 09:03:04 1 576   ruby
8 如何在模块中动态定义类的所有实例方法?

我要prepend (或include )某些模块插入class 。 该模块应该通过自定义动态定义class定义的所有实例方法。 那可能吗 ? 像这样 可能? 如果您想了解更多我想做的事情,可以在这里阅读https://github.com/elabs/pundit/is ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM