Ruby访问控制特殊方法介绍

开发 开发工具
对于刚刚接触Ruby语言不久的朋友来说,Ruby访问控制的理解还有跟多不足之处。希望本文介绍的内容可以帮助我们提高对它的理解。

通过对Ruby语言的学习,我们可以知道, 它是一种特殊的编程语言。特殊之处在于没有函数,只有方法。下面就向大家介绍一种特殊方法,Ruby访问控制。#t#

想想当我们在"***层"而不是在一个类的定义里定义一个方法时会发生什么.我们可以把这样的方法设想为在像C那样的传统语言中的函数的类似物.

  1. ruby> def square(n)   
  2. | n * n   
  3. | end   
  4. nil   
  5. ruby> square(5)   
  6. 25   

 

Ruby访问控制看起来不属于任何类,但实际上Ruby将其分给Object类,也就是所有其它类的父类.因此,所有对象现在都可以使用这一方法.这本应是正确的,但有个小陷阱:它是所有类的私有(private)方法.我们将在下面讨论这是什么意思,但一个结果是它只能以函数的风格调用,像这样:

  1. ruby> class Foo   
  2. | def fourth_power_of(x)   
  3. | square(x) * square(x)   
  4. | end   
  5. | end   
  6. nil   
  7. ruby> Foo.new.fourth_
    power_of 10   
  8. 10000   

 

我们不允许向一个对象明确地运用Ruby访问控制这一方法:

  1. ruby> "fish".square(5)   
  2. ERR: (eval):1: private method 
    `square' called for "fish":String   

 

这一聪明的做法在 ruby 使得提供可以像在传统语言中那样运用函数的同时保持了 ruby 的纯OO性质(函数仍是对象方法,但接受者隐式的为self).

在OO编程里,有一个不成文的习惯,我们在前面的章节里有所暗示的,即有关规格(specification)和实现(implementation)的区别,或者说对象被要求完成什么任务和实际上它是怎样完成的.

对象的内部工作应该对用户保持隐蔽;他们应该只关心输入什么和输出什么,并相信对象知道它在内部是在做什么.如此,某些外面世界看不见但却在内部使用(并可以由程序员在任何需要的时候改进,而不用改变用户看到的类的对象)的方法将很有用.在下面这个普通的例子里,你可以把engine看作类的内部隐式方法.

  1. ruby> class Test   
  2. | def times_two(a)   
  3. | print a," times two is ",engine(a),"\n"   
  4. | end   
  5. | def engine(b)   
  6. | b*2   
  7. | end   
  8. | private:engine # this hides 
    engine from users   
  9. | end   
  10. Test   
  11. ruby> test = Test.new   
  12. #<Test:0x4017181c>   
  13. ruby> test.engine(6)   
  14. ERR: (eval):1: private method 
    `engine' called for #
    <Test:0x4017181c>   
  15. ruby> test.times_two(6)   
  16. 6 times two is 12.   
  17. nil  

 

开始时,我们本希望test.engine(6)返回12,但随后当我们扮演一个Test对象用户时我们了解到engine是不可访问的(inaccessible).只有Test的其它方法,像 times_two可以使用 engine.

我们被要求保持程序的外部接口,也就是 times_two这些方法.管理此类的程序员可以自由的更改engine(这里,可能把b*2改为b+b,假设这样可以提高性能)而不影响用户与 Test 对象打交道.这个例子当然过于简单;Ruby访问控制的优点只有当我们开始写更复杂和有趣的类时方能显现出来.

责任编辑:曹凯 来源: jb51.net
相关推荐

2009-12-14 16:26:40

Ruby复制文件

2009-12-17 17:13:23

Ruby for Ec

2009-12-15 11:31:53

Ruby self

2009-12-16 15:04:26

Ruby实现strea

2009-12-15 17:04:56

Ruby使用HTTP协

2009-12-16 14:04:04

Ruby对象初始化

2009-12-17 11:14:50

Ruby on Rai

2009-12-18 15:56:05

Ruby特殊语法

2009-12-28 15:39:33

WPF滑动条

2010-03-02 13:54:43

WCF控制服务对象释放

2012-09-18 09:50:41

2009-02-04 17:44:10

ibmdwWSRR

2009-12-14 13:56:12

Ruby特点

2011-06-14 10:43:44

索引

2009-12-18 14:35:01

Ruby奇特变量

2010-02-02 14:55:35

C++访问控制符

2009-12-14 13:06:08

Ruby数字类型

2009-12-16 14:40:14

Ruby控制结构

2009-12-14 18:30:59

Ruby DSL特点

2010-04-28 18:38:51

Oracle虚拟数据控
点赞
收藏

51CTO技术栈公众号