ruby中的顶层方法
在ruby中写顶层函数的时候,总会有一个问题,self是谁,这些方法是谁的,是什么方法。
如下:
p self p self.class def talk
p self
end talk
输出main,Object,main
由此可见,在写顶层代码的时候,ruby自动提供了一个默认的self,它是Object类的实例对象,main。
那么这个方法talk是属于谁呢?虽然它当前的self是main。
通过特殊的规定(就是规定的。参考ruby for rails中文版153页),顶层方法是Object类的私有实例方法。
私有实例,意味着,不能显示调用。而每个对象所属的类都是Object的后代,因此每个对象都可以调用顶层方法,只是不能显示调用。
如下:
def talk
puts "hello world"
end
talk obj = Object.new def obj.method
talk
end
obj.method obj.talk
输出是hello world, hello world,in `<main>': private method `talk' called for #<Object:0x1ee7768> (NoMethodError)
定义一个顶层方法talk,main作为接收者调用,合法。定义一个Object的对象obj,为obj建立一个单例方法method,在method中调用talk,也合法。这是因为在单例方法中self是obj,而obj是Object的一个实例,可以调用Object的实例方法(顶层方法是私有实例方法)。但是在外面直接调用talk方法则不行,因为talk是一个私有方法。如错误所说。
另外,puts ,print那些顶层方法,是kernel内建的私有实例方法。因此也不能显示调用。
ruby中的顶层方法的更多相关文章
- ruby中的私有方法和保护方法
		ruby中的私有方法是指方法只能被隐含调用,不能被显示调用.而当没有显示接收者的时候,会把self当成接收者.因此,只能在自身中调用私有方法,这也是私有方法的调用规则. ruby的私有方法机制目的是: ... 
- ruby中的回调方法和钩子方法
		在ruby中,当某些特定的事件发生时,将调用回调方法和钩子方法.事件有如下几种: 调用一个不存在的对象方法 类混含一个模块 定义类的子类 给类添加一个实例方法 给对象添加一个单例方法 引用一个不存在的 ... 
- ruby中的return方法及class实例方法的initialize方法
		return是函数的返回值 class Mtring def initialize(str) @name = str end def aa ary = @name.split(/:/) return ... 
- ruby中http请求方法整理
		#POST请求 请求包是json包 返回body并转换成json对象def post_json *args uri = URI.parse args[0] req = Net::HTTP::Post. ... 
- Ruby字符串的一些方法
		最近因为公司需求开始看ruby,先从ruby的基本数据类型开始看 看到ruby的字符串类型string,发现ruby中的字符串单双引号是不一样的,这点和Python有那么点不一样 主要是我们对字符串进 ... 
- ruby中顶层定义的方法究竟放在哪里?
		ruby中顶层(top level)中定义的方法放在main中,证明如下: self.private_methods(false) #IN TOP LEVEL 那么methods方法究竟是在哪定义的, ... 
- ruby中如何调用与局部变量同名的私有方法
		如果ruby中一个局部变量名和私有方法名同名的话,默认该名称被解释为变量而不是方法: x=10; def x;puts "what?" end 当你输入x实际不能执行x方法.解释器 ... 
- Ruby中方法的设计理念
		Ruby中的方法命名遵从与局部变量相同的规则和约定.这是一种设计理念:方法并不因其自身作为方法而被人关注,而是简单地作为提供值的表达式融入到程序的结构中. 
- 在 Ruby 中执行 Shell 命令的 6 种方法
		我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb & ... 
随机推荐
- UVA 548(二叉树重建与遍历)
			J - Tree Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Ap ... 
- 解决项目导入dubbo依赖项目报红叉问题
			1.maven+ssm项目导入dubbo依赖 项目报错如下 2.出错原因在于dubbo依赖低版本的spring和低版本netty,准备通过maven的依赖管理将依赖传递过来的低版本的spring和ne ... 
- Python学习笔记5-元组Tuple
			tuple和list非常类似,但是tuple一旦初始化就不能修改,它也没有append(),insert()这样的方法.其他获取元素的方法和list是一样的 元组是用圆括号括起来的,其中的元素之间用逗 ... 
- shell脚本学习总结02--数组
			bash同时支持普通数组个关联数组,普通数组只能使用整数作为数组的索引,关联数组可以使用字符串作为数组的索引. 数组的定义方法: 在单行中使用一列值定义一个数组 [root@new ~]# array ... 
- 通过Servlet获取初始化参数
			获取初始化参数在web.xml中配置Servlet时,可以配置一些初始化参数.而在Servlet中可以通过ServletConfig接口提供的方法来获取这些参数.(其实还可以通过ServletCont ... 
- Egret在Chrome浏览器中的内存占用(内存泄露)
			参考: 怎样查看Chrome的内存占用情况 JS内存泄漏排查方法(Chrome Profiles) chrome内存泄露(一).内存泄漏分析工具 chrome内存泄露(二).内存泄漏实例 目录: 一 ... 
- 【BZOJ1706】[usaco2007 Nov]relays 奶牛接力跑 矩阵乘法
			[BZOJ1706][usaco2007 Nov]relays 奶牛接力跑 Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项 ... 
- angular 2+ 路由守卫
			1. 定义接口名称 /domain/login-guard.ts export interface LoginGuard { data: any; msg: string; status: boole ... 
- 离线微博工具Open Live Writer(Windows Live Writer)安装过程及server error 500错误解决
			必备条件: .net framework 3.5框架(大概是要求3.5或以上,不确定,好像没有人遇到和这个相关的问题) 2017年7月27日最新官方版0.6.2英文离线客户端网盘下载(官网的安装包无法 ... 
- Zabbix低级主动发现之MySQL多实例
			接上篇:Zabbix自动发现与主动注册 在一个agent安装一个maraidb 拷贝一个原始配置文档并且修改配置用于开启多实例 按照配置文件初始化数据库 mysql_install_db --user ... 
