前情提要:

在第五天的最后,我们提到了一句话“相同的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的更多相关文章

  1. php public protected private属性实例详解

    php 类中函数和类变量都有三个属性:public protected private,具体什么时候使用什么属性好纠结,特意找了个实例,这样看起来更清晰. public 表示全局,类内部外部子类都可以 ...

  2. c++三种继承方式public,protect,private

    C++中的三种继承public,protected,private 三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员 ...

  3. 【转载】C++中public,protected,private访问

    第一:private, public, protected 访问标号的访问范围. 假如我们约定: 类内部-----指的是当前类类型的定义中,以及其成员函数的声明和定义中: 类外部-----指的是不在当 ...

  4. JAVA修饰符类型(public,protected,private,friendly)

    转自:http://www.cnblogs.com/webapplee/p/3771708.html JAVA修饰符类型(public,protected,private,friendly) publ ...

  5. JAVA类型修饰符(public,protected,private,friendly)

    JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...

  6. 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意

    大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...

  7. C++:继承访问属性(public/protected/private)

    • 公有继承(public) 公有继承在C++中是最常用的一种继承方式,我们先来看一个示例: #include<iostream> using namespace std; class F ...

  8. 快速理解类的访问控制(public,protected,private)

    接触过面向对象编程的朋友们都知道类中的访问控制符无非有三个,public, protected, private. 理解他就先从期望他达到的效果先说吧 Public: 使成员对于整个程序内(类内类外) ...

  9. C++中public,protected,private派生类继承问题和访问权限问题

    C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...

随机推荐

  1. Ignite(三): Ignite VS Spark

    参考:https://www.itcodemonkey.com/article/9613.html gnite 和 Spark,如果笼统归类,都可以归于内存计算平台,然而两者功能上虽然有交集,并且 I ...

  2. jdk1.8源码解析(1):HashMap源码解析

    jdk1.8 HashMap数据结构 图1-HashMap类图 图2-TreeNode类图 由图1-HashMap类图可知HashMap底层数据结构是由一个Node<K,V>的数组构成.具 ...

  3. python各种类型日期转换大全

    最近写python做各种日期转换比较多,顺便总结一下,先上张图: # 根据字符串类型转日期 返回值类型<class 'time.struct_time'> st_time = time.s ...

  4. C#模拟Https请求时出现 基础连接已经关闭 未能为 SSLTLS 安全通道建立信任关系

    //解决方法: //引入命名空间: using System.Security.Cryptography.X509Certificates; using System.Net.Security; // ...

  5. 用crontab部署定时任务

    1.(centos)安装crontab服务 yum install crontabs 2.启动.停止.重启.重载服务 /sbin/service crond start /sbin/service c ...

  6. MSDE2008安装备忘

    MSDE2008安装备忘(适用于WIN7 8 10) 1.系统中必须要VC8.0,即VC2005运行库.2.系统中必须要有.net framework2.0.3.5.4.6运行库.3.windows防 ...

  7. ssh登录原理及免密登录配置

    ssh登录原理参考: https://www.cnblogs.com/hukey/p/6248468.html ssh登录有两种方式: 1):用户名密码登录 2):基于秘钥的登录 ssh免密登录指的就 ...

  8. js 浏览器窗口大小改变 高度 宽度获取 window/document.height()区别

    <script> //当浏览器的窗口大小被改变时触发的事件window.onresize window.onresize = function(){ console.log($(windo ...

  9. 如何限制指定textFiled第三方输入法切换

    在有些项目中需要用到输入纯数字的键盘,并且还不能切换到第三方输入法! textFiled.secureTextEntry = YES; [textFiled addTarget:self action ...

  10. [UE4]AttachToComponent的AttachmentRule

    官方文档 KeepRelative 将当前相对转换保持为新父级的相对转换 KeepWorld 自动计算相对变换,使附着的组件保持相同的世界变换 SnapToTarget 捕捉转换到附着点