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中的私有方法和保护方法的更多相关文章

  1. ruby中的链式访问和方法嵌套

    先看一道题,这道题是codewars上的一道题,我很早就看到了,但是不会写.等到又看到这道题的时候,我刚看完元编程那本书,觉得是可以搞定它的时候了.废话不多说,先看这道题,题目最开始是为JavaScr ...

  2. Ruby中Enumerable模块的一些实用方法

    我在查看 Array 类和 Hash 类的祖先链的时候都发现了 Enumerable,说明这两个类都mixin了Enumerable模块.Enumerable模块为集合型类提供了遍历.检索.排序等方法 ...

  3. ruby中rsa加签解签方法

    # coding:utf-8require 'openssl'require 'base64'# rsa签名,文本内容和私钥路径def rsa_sign(data,private_key_path) ...

  4. 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 ...

  5. ruby中的可调用对象--方法

    上一篇讲了ruby中的可调用对象proc和lambda,他们都是块转换成的对象.ruby中的可调用对象还有方法.通过使用method方法,并且以方法名作为参数(字符串或者符号),就可以得到一个方法对象 ...

  6. ruby中如何调用与局部变量同名的私有方法

    如果ruby中一个局部变量名和私有方法名同名的话,默认该名称被解释为变量而不是方法: x=10; def x;puts "what?" end 当你输入x实际不能执行x方法.解释器 ...

  7. ruby中的顶层方法

    在ruby中写顶层函数的时候,总会有一个问题,self是谁,这些方法是谁的,是什么方法. 如下: p self p self.class def talk p self end talk 输出main ...

  8. Python类中的 私有变量和私有方法

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...

  9. PHP通过反射方法调用执行类中的私有方法

    PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 下面我们演示一下如何通过反射,来调用执行一个类中的私有方法: <?php //MyClass这个类中包 ...

随机推荐

  1. ubuntu16.04 安装 eclipse

    1. 下载jdk , jdk-8u77-Linux-x64.tar.gz 2.下载 eclipse  , eclipse-jee-mars-2-linux-gtk-x86_64.tar.gz 注:我下 ...

  2. Boost-date_time库学习

    最近开了boost库的学习,就先从日期-时间库开始吧,boost的date_time库是一个很强大的时间库,用起来还是挺方便的. 以下代码只是入门级的简单学习,更详细的资料参考boost源码.  C+ ...

  3. iOS开发之--使用storyboard下,tabbar小图标和文字颜色的设置

    在开发项目的时候,如果是使用故事版设计的架构,那么在设置tabbar小图标的时候,可能会出现一点小问题, 成功的设置方法如下: 1.设置seleectedImage和image,其实就是非选中状态的图 ...

  4. leetcode -- Maximal Rectangle TODO O(N)

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...

  5. Gson 解析JSON数据

    {"province":[{"name":"安徽省","city":[{"name":"安 ...

  6. absolute float 比较分析

    同一:absolute-float 都脱离了文档流,也就是默认情况下,父盒子计算高度不包括 absolute/float 的元素 下例: 两个 parentDiv,背景色:深海蓝;边框:1px红色实线 ...

  7. MySQL按照汉字的拼音排序、按照首字母分类

    项目中有时候需要按照汉字的拼音排序,比如联系人列表.矿物分类等,有的还需要按拼音字母从A到Z分类显示. 如果存储汉字的字段编码使用的是GBK字符集,因为GBK内码编码时本身就采用了拼音排序的方法(常用 ...

  8. git学习(6)多人协作

    git学习(6)多人协作 当我们从远程仓库克隆的时候,git会自动的把本地的master和远程的master对应起来,并且远程仓库的默认名称是origin 查看远程库的信息 $ git remote ...

  9. PCRE library

    wget http://nginx.org/download/nginx-1.15.6.tar.gz tar -xvf nginx-1.15.6.tar.gz ln -s nginx-1.15.6 n ...

  10. 关于HashSet在 java7 与 java8的不同

    作者:RednaxelaFX链接:https://www.zhihu.com/question/28414001/answer/40733996来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...