找回密码
 注册
搜索
热搜: java php web
查看: 600|回复: 1

Ruby程序如何实现方法存取控制

[复制链接]
发表于 2009-1-26 07:59:39 | 显示全部楼层 |阅读模式
在许多情况中,当你设计你的应用程序时,你可能想实现一个方法仅为一个对象内部使用而不能为另外一些对象使用。Ruby提供了三个关键字来限制对方法的存取。
· Private:只能为该对象所存取的方法。

· Protected:可以为该对象和类实例和直接继承的子类所存取的方法。

· Public:可以为任何对象所存取的方法(Public是所有方法的默认设置)。

这些关键字被插入在两个方法之间的代码中。所有从private关键字开始定义的方法都是私有的,直到代码中出现另一个存取控制关键字为止。例如,在下面的代码中,accessor和area方法默认情况下都是公共的,而grow方法是私有的。注意,在此doubleSize方法被显式指定为公共的。一个类的initialize方法自动为私有的。

  1. class Rectangle
  2. attr_accessor :height, :width
  3. def initialize (hgt, wdth)
  4. @height = hgt
  5. @width = wdth
  6. end
  7. def area ()
  8. @height*@width
  9. end
  10. private #开始定义私有方法
  11. def grow (heightMultiple, widthMultiple)
  12. @height = @height * heightMultiple
  13. @width = @width * widthMultiple
  14. return "New area:" + area().to_s
  15. end
  16. public #再次定义公共方法
  17. def doubleSize ()
  18. grow(2,2)
  19. end
  20. end
复制代码
如下所示,doubleSize可以在对象上执行,但是任何对grow的直接调用都被拒绝并且返回一个错误。


复制代码
  1. irb(main):075:0> rect2=Rectangle.new(3,4)
  2. => #<Rectangle:0x59a3088 @width=4, @height=3>
  3. irb(main):076:0> rect2.doubleSize()
  4. => "New area: 48"
  5. irb(main):077:0> rect2.grow()
  6. NoMethodError: private method 'grow' called for #<Rectangle:0x59a3088 @width=8, @height=6>
  7. from (irb):77
  8. from :0
复制代码
默认情况下,在Ruby中,实例和类变量都是私有的,除非提供了属性accessor和mutator。
发表于 2009-1-26 09:30:12 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|软晨网(RuanChen.com)

GMT+8, 2024-9-20 15:37

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表