ruby中的私有方法和保护方法
ruby中的私有方法是指方法只能被隐含调用,不能被显示调用。而当没有显示接收者的时候,会把self当成接收者。因此,只能在自身中调用私有方法,这也是私有方法的调用规则。
ruby的私有方法机制目的是:使得你很容易将方法分为两种,外部世界可以访问的方法和外部世界不可以访问的方法。
如下:
class A
def a
self.method
end
def method
p "hello world"
end
private :method
end
A.new.a
method定义成私有方法,不能直接调用,只能通过a调用,但是方法a中是不能正常运行的。因为私有方法是要隐式调用的。去掉self就可以了。method的默认接收者就是A的实例对象,而method也是A的实例方法。
私有方法和单例方法的区别:
单例方法是某个对象的方法,它属于这个对象,默认情况它是公有的,当然你也可以设置它为私有。
私有的非单例方法,可以被任意数目的对象共享,但需要从合适的场合调用,是否可以调用私有方法的决定因素,不在于想要给哪个对象发送消息,而在于发送消息时哪个对象是self。
保护方法:
保护方法调用规则:只要默认对象self和你想要调用的方法所属的对象是同一个类的实例,你就可以调用该保护方法。
它的目的是让某个类的实例和该类的另一个实例协作完成某些任务。
如下:
class A
def initialize(n)
@n = n
end def n
@n
end def compare(c)
if c.n > n
puts "The other object is bigger"
else
puts "THe other object is smaller"
end
end
protected :n
end
c1 = A.new(100)
c2 = A.new(20)
c1.compare(c2)
这个程序是用来比较两个数的大小,它们都是同一个类的实例。因此用protected方法是合法的。
继承和私有方法
子类继承父类的方法访问权限规则。如果类C有一组访问权限规则,且类D是C的子类,那么D的实例将表现出和C的实例一样的访问权限规则。但是,如果类D中定义设置了新的访问权限规则,这样,新的规则将优先于继承的规则。
ruby中的私有方法和保护方法的更多相关文章
- ruby中的链式访问和方法嵌套
先看一道题,这道题是codewars上的一道题,我很早就看到了,但是不会写.等到又看到这道题的时候,我刚看完元编程那本书,觉得是可以搞定它的时候了.废话不多说,先看这道题,题目最开始是为JavaScr ...
- Ruby中Enumerable模块的一些实用方法
我在查看 Array 类和 Hash 类的祖先链的时候都发现了 Enumerable,说明这两个类都mixin了Enumerable模块.Enumerable模块为集合型类提供了遍历.检索.排序等方法 ...
- ruby中rsa加签解签方法
# coding:utf-8require 'openssl'require 'base64'# rsa签名,文本内容和私钥路径def rsa_sign(data,private_key_path) ...
- windows下ruby中显示中文的3种方法
A: 1将x.rb编码为ascii格式 2 在x.rb开头加上 #code:gbk或者 #coding:gbk B: 1 将x.rb编码为utf-8格式 2 在x.rb开头加上 #code:utf-8 ...
- ruby中的可调用对象--方法
上一篇讲了ruby中的可调用对象proc和lambda,他们都是块转换成的对象.ruby中的可调用对象还有方法.通过使用method方法,并且以方法名作为参数(字符串或者符号),就可以得到一个方法对象 ...
- ruby中如何调用与局部变量同名的私有方法
如果ruby中一个局部变量名和私有方法名同名的话,默认该名称被解释为变量而不是方法: x=10; def x;puts "what?" end 当你输入x实际不能执行x方法.解释器 ...
- ruby中的顶层方法
在ruby中写顶层函数的时候,总会有一个问题,self是谁,这些方法是谁的,是什么方法. 如下: p self p self.class def talk p self end talk 输出main ...
- Python类中的 私有变量和私有方法
默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...
- PHP通过反射方法调用执行类中的私有方法
PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 下面我们演示一下如何通过反射,来调用执行一个类中的私有方法: <?php //MyClass这个类中包 ...
随机推荐
- SQL命令优化(积累)
与数据库交互的基本语言是sql,数据库每次解析和执行sql语句多需要执行很多步骤.以sql server为例,当数据库收到一条查询语句时,语法分析器会扫描sql语句并将其分成逻辑单元(如关键词.表达式 ...
- Socket 进行发送
最灵活的通信方式还是Socket ,TcpClient和Tcplistener只是对Socket进行了一些包装,从而使他们使用起来更简单一些 给出同步的服务器端 static void Main(st ...
- 自定义控件_StickyNavLaout
关注我一.View结构原理1.extends linearLayout 继承想要用的布局,首先完成布局的填充在 onFinishInflate 方法中 findViewById(); @Overrid ...
- 面试题思考:Java RMI与RPC,JMS的比较
RPC:(Remote Procedure Call) 被设计为在应用程序间通信的平台中立的方式,它不理会操作系统之间以及语言之间的差异. 支持多语言 RMI:(Remote Method Invo ...
- Myeclipse创建Maven项目
1.右击new创建一个Maven Project: 点击Next 继续Next Finish 2.项目成功创建后,项目目录主要有:主代码目录.主资源目录.测试代码目录.测试资源目录.输出目录(代码编译 ...
- css位置相关元素
1.border 是边框的意思,它可以设置粗细,多少像素,输入样式,solid是实线的意思,可以直接选择color边框的颜色. 也可以设置某个方向的边框,例如 设置一个div,让它的高和宽都为 ...
- handlebears使用
Handlebars 文档笔记: http://www.ghostchina.com/handlebars-wen-dang-bi-ji/ Handlebars模板引擎中的each嵌套及源码浅读: h ...
- Django学习笔记第三篇--关于响应返回
一.返回简单类型: #1.返回简单字符串 #from django.http import HttpResponse return HttpResponse("return string&q ...
- 查看嵌入式设备的CPU频率
对于有多个核心的CPU,查看CPU 频率的方法是: cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq 上面的这个是查看核心0的cpu的 ...
- UNION WHERE
w条件语句的作用域. SELECT * FROM ( SELECT asin, LOWER(country) AS country FROM grab_amzreviews_asins UNION D ...