使用Ruby中的私有方法进行递归调用

时间:2014-11-17 03:28:30

标签: ruby recursion methods private

为什么这段代码有效?我知道private可以作为方法的修饰符,并且使用显式接收器(self)将不起作用。

我知道会有一个SystemStackError,但我想了解可见性的概念。

class Methods
    private
    def private_method
        puts "I'm in private method"
        self.private_method
    end
end
class ChildMethods < Methods
    def private_method
        super
    end
end
ChildMethods.new.private_method

2 个答案:

答案 0 :(得分:1)

你有两个private_method方法,一个在超类中(私有)和一个子类中的覆盖(公共)。

您的代码有效,因为超类中的self.private_method不会调用自己的私有private_method,而是在子类中公开的。{/ p>

例如,这不起作用:

Methods.new.send(:private_method)

答案 1 :(得分:1)

无法为显式接收器调用私有方法,但可以像隐式那样调用方法。换句话说,一个对象可以调用另一个对象 - 超类私有方法,因为它存在于它自己的上下文中。

由于没有明确的接收器,这也可以正常工作

  1 class Methods
  2     private
  3     def private_method
  4         puts "I'm in private method"
  5         private_method
  6     end
  7 end
  8 class ChildMethods < Methods
  9     def public_method
 10       private_method
 11     end
 12 end
 13 ChildMethods.new.public_method

但是这会引发错误,因为self是一个明确的接收者。

  1 class Methods
  2     private
  3     def private_method
  4         puts "I'm in private method"
  5         self.private_method # <-------------------------
  6     end
  7 end
  8 class ChildMethods < Methods
  9     def public_method
 10       private_method
 11     end
 12 end
 13 ChildMethods.new.public_method

Press ENTER or type command to continue
I'm in private method
1.rb:5:in `private_method': private method `private_method' called for #<ChildMethods:0x00000101084290> (NoMethodError)
        from 1.rb:10:in `public_method'
        from 1.rb:13:in `<main>'

这也很好用:

  1 class Methods
  2     private
  3     def private_method
  4         puts "I'm in private method"
  5         self.public_method # <-------------------------
  6     end
  7 end
  8 class ChildMethods < Methods
  9     def public_method
 10       private_method
 11     end
 12 end
 13 ChildMethods.new.public_method