rudy是什么意思:剖析 rudy 访问控制

前面,我们说Ruby没有,只有思路方法.而且实际上有不止种思路方法.这节我们介绍访问控制(access controls).
想想当我们在"最高层"而不是在个类定义里定义个思路方法时会发生什么.我们可以把这样思路方法设想为在像C那样传统语言中类似物.
ruby> def square(n)
| n * n
| end
nil
ruby> square(5)
25

我们新思路方法看起来不属于任何类,但实际上Ruby将其分给Object类,也就是所有其它类父类.因此,所有对象现在都可以使用这思路方法.这本应是正确,但有个小陷阱:它是所有类私有(private)思路方法.我们将在下面讨论这是什么意思,但个结果是它只能以风格,像这样:
ruby> Foo
| def fourth_power_of(x)
| square(x) * square(x)
| end
| end
nil
ruby> Foo..fourth_power_of 10
10000

我们不允许向个对象明确地运用这思路方法:
ruby> "fish".square(5)
ERR: (eval):1: private method `square' called for "fish":String

聪明做法在 ruby 使得提供可以像在传统语言中那样运用同时保持了 ruby 纯OO性质(仍是对象思路方法,但接受者隐式为self).
在OO编程里,有个不成文习惯,我们在前面章节里有所暗示,即有关规格(specication)和实现(implementation)区别,或者说对象被要求完成什么任务和实际上它是怎样完成.对象内部工作应该对用户保持隐蔽;他们应该只关心输入什么和输出什么,并相信对象知道它在内部是在做什么.如此,某些外面世界看不见但却在内部使用(并可以由员在任何需要时候改进,而不用改变用户看到对象)思路方法将很有用.在下面这个普通例子里,你可以把engine看作类内部隐式思路方法.
ruby> Test
| def times_two(a)
| pr 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.
#<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 对象打交道.这个例子当然过于简单;访问控制优点只有当我们开始写更复杂和有趣类时方能显现出来.
Tags:  rudyyoungblood valentinorudy rudy什么意思 rudy是什么意思

延伸阅读

最新评论

发表评论