Ruby 一个关于 self 的问题

ptmagic · 2012年04月25日 · 最后由 ptmagic 回复于 2012年04月26日 · 3070 次阅读

我最近在看 ruby 元编程这本书,现在遇到问题

class C
  def public_method
    self.private_method
  end
  private
  def
   private_method;
  end
end
C.new.public_method

会报错,这个可以理解 但是我

object = C.new
object.public_method 

仍然报错。请问为什么

你这两段代码不是一样的嘛 你仔细看书,书上说了,private 方法是不能显式指定接收者的,所以报错的原因是你的第三行代码多了个 self.

#1 楼 @edokeh 那书上还说了,每次调用一个私有方法,只能调用与隐含的接收者-self。意思就是只能用 self.private_method 这种调用方法啊

C.new.public_method 和 object = C.new object.public_method 是一样的

#2 楼 @ptmagic 隐含是指你不能显示指定接收者,即使接收者是 self。换句话说不能用 dot 操作符调用私有方法。

#2 楼 @ptmagic 你理解错了 ”每次调用一个私有方法,只能调用与隐含的接收者-self“ 这句话的意思就是不能在调用 private 方法前加上 self 啊,而不是一定要加上 self 不知道我说清楚了没。。。

#4 楼 @doitian 大概了解了谢谢哈,那我还有一个问题哈,如果调用方法的接收者不是你自己,则必须明确指明一个接收者是什么意思

#5 楼 @edokeh 概了解了谢谢哈,那我还有一个问题哈,如果调用方法的接收者不是你自己,则必须明确指明一个接收者是什么意思

#7 楼 @ptmagic obj.some_method(1,2) 这就叫明确指定接收者 some_method(1,2)这叫不指定接收者,但是 ruby 中所有的方法调用都有接收者,所以这里实际上有一个隐含的接收者 self

刚刚看 ihower 的 rspec 幻灯片,里面有段代码也是用 self.private_method 来调用的,不知道是不是以前老点的 ruby 版本是这样做的。http://www.slideshare.net/ihower/rspec-7394497

#8 楼 @fsword 你好,那什么叫方法的接受者不是你自己呢??

#8 楼 @fsword 不都是用实例去调用自己的私有方法吗?难道还能用实例却调用别的私有方法?

#10 楼 @ptmagic obj.some_method(1,2)这里方法 some_method 的接收者就不是你自己阿(是 obj) 私有方法的关键是不能用 self 去调用,只能写在公开方法中被调用,这样就天然保证了它对外不可见,比如对于这样的类定义:

class A
    public
        def pub_method
        end
    private
        def pri_method
        end
end


你可以这样:

a = A.new
a.pub_method


但是对于私有方法则不能:

a = A.new
a.pri_method # 这样写违反原则 “private方法不能显式指定接收者”
pri_method    # 这样是就变成调用外面某个名叫pri_method的函数了,事与愿违


这样导致的结果就是:如果你想调用 pri_method,那就必须放在 class A ... end 这段代码里面

class A
    public
        def pub_method
            pri_method # 这样写才正确,于是确保了私有方法的私有性
        end
    private
        def pri_method
        end
end



代码看着好难受,楼主!

#12 楼 @fsword 谢谢了,懂了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号