剖析 rudy 访问控制

 更新时间:2007年11月24日 14:12:15   作者:  
 前面,我们说Ruby没有函数,只有方法.而且实际上有不止一种方法.这一节我们介绍访问控制(access controls). 

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

ruby> def square(n)
    |   n * n
    | end
   nil
ruby> square(5)
   25  


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

ruby> class Foo
    |   def fourth_power_of(x)
    |     square(x) * square(x)
    |   end
    | end
  nil
ruby> Foo.new.fourth_power_of 10
  10000  


我们不允许向一个对象明确地运用这一方法:

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


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

在OO编程里,有一个不成文的习惯,我们在前面的章节里有所暗示的,即有关规格(specification)和实现(implementation)的区别,或者说对象被要求完成什么任务和实际上它是怎样完成的.对象的内部工作应该对用户保持隐蔽;他们应该只关心输入什么和输出什么,并相信对象知道它在内部是在做什么.如此,某些外面世界看不见但却在内部使用(并可以由程序员在任何需要的时候改进,而不用改变用户看到的类的对象)的方法将很有用.在下面这个普通的例子里,你可以把engine看作类的内部隐式方法.

ruby> class Test
    |   def times_two(a)
    |     print a," times two is ",engine(a),"\n"
    |   end
    |   def engine(b)
    |     b*2
    |   end
    |   private:engine  # this hides engine from users
    | end
   Test
ruby> test = Test.new
   #<Test:0x4017181c>
ruby> test.engine(6)
ERR: (eval):1: private method `engine' called for #<Test:0x4017181c>
ruby> test.times_two(6)
6 times two is 12.
   nil  


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

相关文章

  • 深入剖析Ruby设计模式编程中对命令模式的相关使用

    深入剖析Ruby设计模式编程中对命令模式的相关使用

    这篇文章主要介绍了Ruby设计模式编程中对命令模式的相关使用,文中还讲到了关于观察者模式和命令模式的一些概念区别,需要的朋友可以参考下
    2016-04-04
  • 在Ruby on Rails中优化ActiveRecord的方法

    在Ruby on Rails中优化ActiveRecord的方法

    这篇文章主要介绍了在Ruby on Rails中优化ActiveRecord的方法,本文来自于IBM官方网站技术文档,需要的朋友可以参考下
    2015-04-04
  • ruby 流程控制 方法

    ruby 流程控制 方法

    ruby 流程控制 方法...
    2007-11-11
  • ruby实现github第三方认证

    ruby实现github第三方认证

    GitHub在用户认证过程中采用了双匙机制,在双匙加密机制中,只有合法用户才拥有私匙,只要GitHub在收到请求时可以证明提交请求的客户端上拥有该私匙,即可以确认该操作是由合法用户发起的。我们通过ruby来简单模拟下吧。
    2015-06-06
  • Ruby面向对象编程详解

    Ruby面向对象编程详解

    这篇文章主要介绍了Ruby面向对象编程详解,本文讲解了类的定义、定义对象、initialize方法、实例变量、类变量、类常量、类的继承等内容,需要的朋友可以参考下
    2014-10-10
  • Rails Routes中new、collection、member的区别浅析

    Rails Routes中new、collection、member的区别浅析

    这篇文章主要介绍了Rails Routes中new、collection、member的区别浅析,本文先是对这3个自定义路由参数做了讲解,然后总结了它的们的区别,需要的朋友可以参考下
    2015-01-01
  • Python的Flask框架中SERVER_NAME域名项的配置教程

    Python的Flask框架中SERVER_NAME域名项的配置教程

    SERVER_NAME项在Flask的路由配置中至关重要,特别是在配置绝对url和子域名的操作中,这里我们就来看一下Python的Flask框架中SERVER_NAME项的配置教程:
    2016-06-06
  • ruby will_paginate的用法

    ruby will_paginate的用法

    老版本的will_paginate是基于plugin方式的,其安装方式如下:ruby script/plugin install svn://errtheblog.com/svn/plugins/will_paginate
    2008-08-08
  • Ruby中的迭代器详解

    Ruby中的迭代器详解

    这篇文章主要介绍了Ruby中的迭代器详解,本文讲解了字符串、数字、数组、Map、文件、目录等情况下使用迭代器的例子,需要的朋友可以参考下
    2014-09-09
  • 在博客中屏蔽垃圾留言的简单方法

    在博客中屏蔽垃圾留言的简单方法

    这篇文章主要介绍了在博客中屏蔽垃圾留言的简单方法,作者以Ruby on Rails搭建的博客应用为例,需要的朋友可以参考下
    2015-08-08

最新评论