【问题标题】:Call Ruby method recursively regardless of it's name无论名称如何,递归调用 Ruby 方法
【发布时间】:2014-09-27 21:12:16
【问题描述】:

如何让一个方法不管它的名字如何都能调用自己,这样如果我想重命名它,我可以在一个地方进行更改?

例子:

class MyClass
    def my_method
        self.children.each do |child|
            child.my_method if child.kind_of?(MyClass) #Replace here 'my_method' to something
        end
    end
end

【问题讨论】:

  • 你想达到什么目的?如果要动态声明方法可以使用define_method,如果要动态调用方法使用call

标签: ruby recursion substitution


【解决方案1】:

您可以使用__method__获取当前正在执行的方法的符号名称,send可以通过名称执行任何方法:

def foo
  send __method__
end

当然,如果您没有一些合理的条件来控制递归,这将很快造成堆栈溢出。

编辑——看起来“递归”意味着你想在该类的所有实例上调用它。但是,这并没有真正为您提供重命名方法的任何灵活性。如果这些实例重新分配了方法的名称和 undef 原始名称,Ruby 仍然找不到它——在程序执行期间会查找方法。

【讨论】:

  • Cary 的 Corey:任何递归方法破坏堆栈的问题并不是问题的核心,因此最好将您的示例转换为更传统的示例,例如:def foo(count); puts count; count += 1; send(__method__,count) if count < 10; end .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2019-10-19
相关资源
最近更新 更多