gpt4 book ai didi

剖析 Ruby 访问控制

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章剖析 Ruby 访问控制由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

前面,我们说Ruby没有函数,只有方法.而且实际上有不止一种方法.这一节我们介绍访问控制(accesscontrols). 。

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

ruby>defsquare(n) 。

|n*n 。

|end 。

nil 。

ruby>square(5) 。

25 。

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

ruby>classFoo 。

|deffourth_power_of(x) 。

|square(x)*square(x) 。

|end 。

|end 。

nil 。

ruby>Foo.new.fourth_power_of10 。

10000 。

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

ruby>"fish".square(5) 。

ERR:(eval):1:privatemethod`square'calledfor"fish":String 。

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

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

ruby>classTest 。

|deftimes_two(a) 。

|printa,"timestwois",engine(a),"\n" 。

|end 。

|defengine(b) 。

|b*2 。

|end 。

|private:engine#thishidesenginefromusers 。

|end 。

Test 。

ruby>test=Test.new 。

# 。

ruby>test.engine(6) 。

ERR:(eval):1:privatemethod`engine'calledfor# 。

ruby>test.times_two(6) 。

6timestwois12. 。

nil 。

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

最后此篇关于剖析 Ruby 访问控制的文章就讲到这里了,如果你想了解更多关于剖析 Ruby 访问控制的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com