Ruby访问控制特殊方法介绍
通过对Ruby语言的学习,我们可以知道, 它是一种特殊的编程语言。特殊之处在于没有函数,只有方法。下面就向大家介绍一种特殊方法,Ruby访问控制。
想想当我们在"最高层"而不是在一个类的定义里定义一个方法时会发生什么.我们可以把这样的方法设想为在像C那样的传统语言中的函数的类似物.
- ruby> def square(n)
- | n * n
- | end
- nil
- ruby> square(5)
- 25
Ruby访问控制看起来不属于任何类,但实际上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访问控制这一方法:
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
相关推荐
javashixisheng 2020-06-25
SZStudy 2020-01-08
hithyc 2019-12-27
kianliu00 2019-12-14
wllinux 2019-11-25
ccschan 2019-11-20
贫农 2019-11-19
88971730 2019-11-18
yinsui 2011-03-11
讨厌什么变成什么 2019-11-04
doITwhat 2019-10-09
stoneechogx 2019-10-24
85407718 2019-10-23
80791492 2019-09-22
海绵宝宝的欧尼 2012-09-08
hanwentan 2012-02-17
Linux 2011-07-01