Ruby中的访问控制

今天在写ruby的时候发现了这样一个问题: 在自己的类中竟然无法调用自身的private方法, 报NoMethodError. 于是网上查了一下, 原来在ruby中, 访问控制权限和java, c++中的不太一样.

看来还有很多东西需要了解, 在这里简单纪录一下. 图片只是随手P的, 于本文没有任何关系哈;)

问题

先看一段很简单的代码:

private.rb
1
2
3
4
5
6
7
8
9
10
11
12
class A
  def f1
    puts self.f2
  end

  private
  def f2
    'this is private method : f2'
  end
end

A.new.f1

运行以上代码报了下面的错误:

private.rb
1
2
private.rb:3:in `f1': private method `f2' called for #<A:0x007fce2c1f5070> (NoMethodError)
    from private.rb:12:in `<main>'

竟然无法调用自己的private方法.

原因

网上搜索一番, 找到了一篇总结的相当到位的文章, 把这个问题解释的很透彻. 另外这个博主的文章质量都挺高的, 值得一读;)

简单总结一下就是: ruby中的访问控制权限用于限制控制消息的接收者. 如果一个方法被指定为private, 那么在调用时不能指定接收者(不管是不是self). 另外一个注意点是即使将方法设置成private, 在子类中也是可以调用的.

为了解决上面的问题, 只需要将f1中的调用改为puts f2, 即可正常输出.

PPPPSSSS

  1. 最近发现自己网站的dns解析有问题, 在部分地区访问不了, 郁闷….
  2. 产品运营也是门学问啊, 学习了;)

Comments