Day06 - Ruby三种存取限制:Public,Protected,Private
前情提要:
在第五天的最后,我们提到了一句话“相同的class的实体也无法使用别人的singleton method”。
在今天,我们把焦点放在Ruby的method,继续了解存取限制:)
Ruby经典面试题目#06
说明Ruby的三种存取限制。3 levels of access control for Ruby methods.
让我们用Ruby代码分别描述三种存取:Public,Protected,Private:
class TingsIronmanProcess
def publish
p“Hi guys,this is my IT article for today!”
end
protected
def mydraft
p“Hi Mentor!Please read my draft.“
end
private
def myspace
p“I'm writing secretly here!”
end
end
day6 = TingsIronmanProcess.new
day6.publish # => Hi guys,this is my IT article for today!
以我自己生产第六天IT赛文章为例,为了防止网络断线,或是在IT邦写完误按其他的钮导致存盘出现问题,我通常在本机环境上编写每天的主题。在这段时间要搜集素材、测试代码,这个过程可能会有很多生产上的秘密、需要删除的错误等等之类的,过程艰辛不足为外人道矣,所以放在private的myspace方法孤芳自赏就好(jxpue)。
等到文章接近完成度高、可读性佳的地步,就放在protected的环境,开放一些权限给它人阅读,例如请Ruby前辈'馒头猫'先校稿,提供修改建议。
所以如果在class外想要取得protected或private方法,都会出现NoMethodError错误:
day6.protected #=> undefined method `protected'(NoMethodError)
day6.private #=> undefined method `private'(NoMethodError)
当一切修改完毕,就可以品尝甜美果实,放到public区,给大众分享我的作品啦!
以上的类别写法可以改成:
class TingsIronmanProcess
def publish
p“Hi guys,this is my IT article for today!”
end
def mydraft
p“Hi Mentor!Please read my draft.“
end
def myspace
p“I'm writing secretly here!”
end
protected:mydraft
private:myspace
end
这种写法,我觉得蛮类似于在开发Ruby on Rails项目上时常看到类似的构架,哪些套件只能在开发环境development使用,哪些在测试环境test、哪些在正式环境production使用的分组。
gem 'sqlite3',group::development
gem 'pg',group::production
如果我想把第六天的草稿send给menter看,可以把mydraft当作参数,使用send()方法,结果如下:
day6.send(:mydraft)#=>“Hi Mentor!Please read my draft.“
甚至把文章连接先send给某个人看,也行:(要小心!别把不能公开的东西乱放啊!)
day6.send(:myspace)#=>“Hi guys,this is my IT article for today!
如果馒头猫也想使用我的构架来撰写自己的铁人赛文章,可以继承我的类别:
class TingsIronmanProcess
protected
def mydraft
p“Hi Mentor!”
end
private
def myspace
p“I'm writing secretly here!”
end
end
class BaterProcess < TingsIronmanProcess
def bater_draft
mydraft
end
def bater_self_draft
self.mydraft
end
end
BaterProcess.new.bater_draft # Hi Mentor!
BaterProcess.new.bater_self_draft #Hi Mentor!
在加入继承后的新类别,我们引入昨天self物件可以代替自身类别的观念。
以继承的类别来说,在此呼叫Protected method的方式,无论是self.mydraft或是mydraft,输出结果都是Hi Mentor!。
但如果呼叫的是Private method myspace呢?
class BaterProcess < TingsIronmanProcess
def bater_space
myspace
end
def bater_self_space
self.myspace
end
end
如果我们在这里使用.self,就会出错:
BaterProcess.new.bater_space # => I'm writing secretly here!
BaterProcess.new.bater_self_space # => private method `myspace'(NoMethodError)
龙哥的文章说到,呼叫private方法的时候,不能有明确的接收者。爱注意呀!
总结:在写铁人赛的文章时,我都尽可能地把前几篇的概念拿到后面来使用,增加自己观念上的熟悉度,尽量做到具有教育意义地环环相扣。(显示为八点档连续剧制作人?)
在今天Day6这篇文章里,我们把第二天继承和第四天self的概念拿来测试public、protect和private存取方法(xcsjbj),也发现了:
protected:mydraft
private:myspace
:mydraft,:myspace这些冒号在前面的参数。
这到底是什么呢?
明天我们就来讨论符号(Symbol)吧!:)
Day06 - Ruby三种存取限制:Public,Protected,Private的更多相关文章
- php public protected private属性实例详解
php 类中函数和类变量都有三个属性:public protected private,具体什么时候使用什么属性好纠结,特意找了个实例,这样看起来更清晰. public 表示全局,类内部外部子类都可以 ...
- c++三种继承方式public,protect,private
C++中的三种继承public,protected,private 三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员 ...
- 【转载】C++中public,protected,private访问
第一:private, public, protected 访问标号的访问范围. 假如我们约定: 类内部-----指的是当前类类型的定义中,以及其成员函数的声明和定义中: 类外部-----指的是不在当 ...
- JAVA修饰符类型(public,protected,private,friendly)
转自:http://www.cnblogs.com/webapplee/p/3771708.html JAVA修饰符类型(public,protected,private,friendly) publ ...
- JAVA类型修饰符(public,protected,private,friendly)
JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...
- 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意
大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...
- C++:继承访问属性(public/protected/private)
• 公有继承(public) 公有继承在C++中是最常用的一种继承方式,我们先来看一个示例: #include<iostream> using namespace std; class F ...
- 快速理解类的访问控制(public,protected,private)
接触过面向对象编程的朋友们都知道类中的访问控制符无非有三个,public, protected, private. 理解他就先从期望他达到的效果先说吧 Public: 使成员对于整个程序内(类内类外) ...
- C++中public,protected,private派生类继承问题和访问权限问题
C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...
随机推荐
- 利用工具将数据库中的表导出到word中
1.动软代码生成器 效果图: 数据库设计说明书中的一项,刚好我负责写这个文档, 18张表,前两张表是自己画表格自己填充内容,写到第三张表的时候就已经崩溃了(我觉得我耐力还是够的,怎么说也画完了两张表呢 ...
- jdk1.8源码解析(1):HashMap源码解析
jdk1.8 HashMap数据结构 图1-HashMap类图 图2-TreeNode类图 由图1-HashMap类图可知HashMap底层数据结构是由一个Node<K,V>的数组构成.具 ...
- 如何去maven仓库下载jar包
Maven仓库地址 : http://search.maven.org/ https://mvnrepository.com/ 或者你直接百度搜索 : maven仓库 第一个就是 我现在想下载myba ...
- Azure CosmosDB (10) Azure Cosmos DB体系结构
<Windows Azure Platform 系列文章目录> Azure Cosmos DB的体系结构分为以下几个部分: 1.Database Accounts Database Acc ...
- qt5程序打包含qml
Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行. 因此 Qt 官方开发环境里自带了一 ...
- 20175227张雪莹 2018-2019-2 《Java程序设计》第九周学习总结
20175227张雪莹 2018-2019-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十一章 JDBC数据库操作 MySQL数据库管理系统 下载安装MySQL 若下载的是 ...
- maven私库nexus2.3.0-04迁移升级到nexus-3.16.1-02(异机迁移备份)
环境信息: nexus2.3.0-04安装在32位Windows server 2003系统上 安装位置信息如下: 仓库迁移 Nexus的构件仓库都保存在sonatype-work目录中,nexus2 ...
- ct
b80e00u9dxwpqw7bt98rm5zmlxt08cxs A3WKXKBHWDUOEOP3EVJA2YRM6JSZPJWGTCQ5BSYAWI4GMSIXOAT2IQ
- FTP上传文件,报错java.net.SocketException: Software caused connection abort: recv failed
FTP上传功能,使用之前写的代码,一直上传都没有问题,今天突然报这个错误: java.net.SocketException: Software caused connection abort: re ...
- TestNG+Java+Selenium+Maven 代码实例
搭环境时注意不要忘记testng的jar包,selenium的jar包 package com.guge.test; import org.testng.annotations.Test;import ...