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. ...
随机推荐
- 1080P60视频源---verilog
1080P60视频源---verilog `timescale 1ns / 1ps ////////////////////////////////////////////////////////// ...
- php使用insert语句动态添加用户
<html> <head> <title>Adding User</title> </head> <body> <h2&g ...
- (一)CentOS6.3安装Hadoop2.6.5
1.准备环境 下载CentOS: https://www.centos.org/download/ 下载JDK: https://www.oracle.com/technetwork/java/jav ...
- HTML 理解标签 - 帧
帧 : frame(已弃用) 是一个HTML元素,它定义了可以显示另一个HTML文档的特定区域.一个框架应该用在一个框架内 <frameset> iframe 表示嵌套的浏览上下文,有效地 ...
- python selenium 爬取淘宝
# -*- coding:utf-8 -*- # author : yesehngbao # time:2018/3/29 import re import pymongo from lxml imp ...
- Java Lambda expression
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表达式可以使代码变的更加 ...
- sass 和less 分别在循环 和超出省略方面的区别!
这两天在迁项目,新项目支持less预处理器,之前是采用的sass,就出现一些冲突,好在有对应的转换方式,重点说下 我遇到的2个问题 1:超出省略 sass: 声明: 在需要的地方: less: 在使用 ...
- CentOS7安装HDP集群
之前安装大数据组件都是一个一个手动安装的,最多弄一个脚本自动安装.手动安装麻烦不说,还没有可以监控集群的可视化界面,而且组件的稳定性也是个问题. 所以我们应该试一试HDP和CDH这种企业级的hadoo ...
- Scaffold-DbContext 命令参数
NAME Scaffold-DbContext SYNOPSIS Scaffolds a DbContext and entity types for a database. SYNTAX Scaff ...
- JavaScript数组方法--flat、forEach、map
今天到flat了,一个第一次知道该方法还是看到一个面试题,别人给了个答案,用到了flat才知道的方法. 前面也写过关于这道面试题的文章,<一道关于数组的前端面试题>. 这里再来说说吧! f ...