简单谈谈Ruby的private和protected
下面这段程序让我纠结了很久,Ruby中private的概念真的很奇怪。。。
class Test private def test_print puts 'test' end end class Test2 < Test def test_print2 # self.test_print #=> 这里加上self就不能调用,private method `test_print' called for # (NoMethodError) test_print #=> 不加self就能调用 end end Test2.new.test_print2
为什么不加self的话,private也可以调用父类的方法呢?
原来在Ruby中,private和Java或者其他语言不一样,子类也可以调用,只是不能指定调用者。
翻了下《The Ruby Way》,书上说:
private:类和子类都能调用,但是private方法不能指定调用者,默认为self。
protected:类和子类都能调用,可以指定调用者。
这就解释了为什么上面的代码中,用self调用会出错,而不加self就能正确执行。
相关推荐
-
Ruby 之 class 中的 private、 protected、public
Private private 函数只能 在本类和子类的 上下文中调用,且只能通过self访问. 这个意思就是:private函数,只能在本对象内部访问到. 对象实例变量(@)的访问权限就是 private. 复制代码 代码如下: class AccessTest def test return "test private" end def test_other(other) "other object "+ other.test end end t1 = Acce
-
Ruby中的public、private、protected区别小结
重点关注private与protected public 默认即为public,全局都可以访问,这个不解释 private C++, "private" 意为 "private to this class", 但是Ruby中意为 "private to this instance". 意思是:C++中,对于类A,只要能访问类A,就能访问A的对象的private方法. Ruby中,却不行:你只能在你本对象的实例中访问本对象的private方法. 因
-
简单谈谈Ruby的private和protected
下面这段程序让我纠结了很久,Ruby中private的概念真的很奇怪... class Test private def test_print puts 'test' end end class Test2 < Test def test_print2 # self.test_print #=> 这里加上self就不能调用,private method `test_print' called for # (NoMethodError) test_print #=> 不加self就能调用
-
简单谈谈PHP面向对象之标识对象
标识对象模式 这个模式主要功能就是创建sql语句中的wehre条件字符串的,下面直接看代码和注释: namespace woo\mapper; //字段对象 class Field { protected $name = null; //字段名称 protected $operator = null; //操作符 protected $comps = array(); //存放条件的数组 protected $incomplete = false; //检查条件数组是否有值 function _
-
Core Java 简单谈谈HashSet(推荐)
同学们在看这个问题的时候,我先提出者两个问题,然后大家带着问题看这个文章会理解的更好. 1.HashSet为什么添加元素时不能添加重复元素? 2.HashSet是否添加null元素? 打开源码, 我们看到如下代码,我们看到HashSet也有一个HashMap做为属性,HashSet()的构造方法就是将这个map实例化.如果大家对HashMap还不了解话,可以看我的这篇博文.还要注意有一个静态final的对象PRESENT,这个是干什么用的,咱们继续往下看. private transient H
-
简单谈谈java自定义注解
Java在1.5开始引入了注解,目前流行的框架都在用注解,可想而知注解的强大之处. 以下通过自定义注解来深入了解java注解. 一.创建自定义注解 package com.sam.annotation; import java.lang.annotation.*; /** * @author sam * @since 2017/7/13 */ @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.R
-
简单谈谈ThreadPoolExecutor线程池之submit方法
jdk1.7.0_79 在上一篇<ThreadPoolExecutor线程池原理及其execute方法>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法.本文解析ThreadPoolExecutor#submit. 对于一个任务的执行有时我们不需要它返回结果,但是有我们需要它的返回执行结果.对于线程来讲,如果不需要它返回结果则实现Runnable,而如果需要执行结果的话则可以实现Callable.在线程池同样execute提供一个不需要返回结果的任务执行,而对
-
Java的外部类为什么不能使用private和protected进行修饰的讲解
Java的外部类为什么不能使用private和protected进行修饰 对于这个问题,一直没有仔细思考,今天整理一下: 对于顶级类(外部类)来说,只有两种修饰符:public和默认(default).因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置.因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default). 如果类使用了private修饰符,说明是个内部类.内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(p
-
简单谈谈require模块化jquery和angular的问题
require 模块化开发问题,正常自己写的模块 是exports 导出一个模块 //模块化引入jquery 不同和问题 require 引入jquery swiper .... 插件和库的时候需要 require.config({ baseUrl:"js/libs", //文件夹目录相对与html的位置 paths:{ 'jquery':"jquery-1.9.1" //插件或库的文件名 'swiper':"文件名/swiper" //当每个插
-
简单谈谈vue的过渡动画(推荐)
在vue中,实现过渡动画一般是下面这样: <transition name="fade"> <div></div> </transition> 用一个transition对元素或者组件进行封装. 在过渡的时候,会有 4 个(CSS)类名在 enter/leave 的过渡中切换. 1.v-enter: 定义进入过渡的开始状态.在元素被插入时生效,在下一个帧移除. 2.v-enter-active: 定义进入过渡的结束状态.在元素被插入时生效
-
react系列从零开始_简单谈谈react
react算是目前最火的js MVC框架了,写一个react系列的博客,顺便回忆一下react的基础知识,新入门前端的小白,可以持续关注,我会从零开始教大家用react开发一个完整的项目,也会涉及到webpack,node等前端知识,每天会更新一篇.这篇react的系列博客会覆盖react目前的所有知识点: 一.React基础 1.React 虚拟DOM概念,React的性能高效的核心算法 2.React组件,理解什么叫组件化 3.React组件嵌套 4.JSX内置表达式 5.React的生命周
随机推荐
- ruby 流程控制 方法
- Linux常用命令last的使用方法详解
- JavaScript 在各个浏览器中执行的耐性
- Asp.Net实现404页面与301重定向的方法
- php的ajax框架xajax入门与试用介绍
- js正则表达式中的问号几种用法小结
- 判断输入的日期是否正确的shell脚本
- Python获取当前页面内所有链接的四种方法对比分析
- JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
- XML轻松学习手册(二):XML概念
- jquery实现去除重复字符串的方法小结
- JS上传图片预览插件制作(兼容到IE6)
- nginx centos 服务开机启动设置实例详解
- Android Map新用法:MapFragment应用介绍
- C# Console类的具体用法
- python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
- JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
- laravel 实现用户登录注销并限制功能
- python事件驱动event实现详解
- JS实现判断有效的数独算法示例