self,自己,在ruby中表示当前对象或默认对象。程序执行的任一时刻,有且仅有一个self。

1.谁成为self,在什么位置成为self?

要知道哪个对象是self,就必须知道当前的上下文。上下文主要有顶层上下文,类定义上下文,模块定义上下文,方法定义上下文。可以根据下图总结的内容进行self的判断。

上下文   例子 哪个对象是self
顶层 在任何定义块之外的代码 main(内建的默认顶层对象)
类定义 class C 类对象C
模块定义 module M   模块对象M
方法定义

1 顶层方法

def method_name

2实例方法定义

class C

  def method_name

3模块中的实例方法定义

module M

def method_name

4单例方法(包括类方法)

def obj.method_name

main(内建的默认顶层对象)

C的一个实例对象,这个实例对象响应method_name方法调用

(1)用M扩展的单个对象

(2)混含了M的类的一个对象实例

obj

1.1顶层中的self

顶层上下文的self是main,顶层方法的self也是main。main是object的一个对象。

1.2类和模块中定义中的self

类中的self是类对象本身

类中实例方法的对象是实例对象

模块的self是模块的名字

1.3单例方法中的self

obj作为对象,它的单例方法中的self就是obj。

2.self作为消息的默认接接收者

方法调用一般是obj.method的方式,用一个圆点标记,左边是接收者,右边是方法。但是,当接收者是self的时候,可以省略接收者和圆点。ruby将self当做默认的接收者,意味着你发送的消息会发给self。即method等价于self.method。

类方法中调用了hello。等价于self.hello。因为在类中,相当于A.hello,打印出了”hello world“。在类外使用hello时,self是main,没有这个函数,所以报错。用A.hello当然是对的。

但是值得注意的是,在调用写方法(以等号结束的方法)的时候,即使是发送消息给当前的self,也不能省略。例如调用方法venue=,要写成self.venue ="hello"。如果写成venue="hello",ruby则将它解释为对局部变量的赋值。

3实例变量和self

ruby中实例变量是以@开头的变量。值得注意的是,在ruby程序中看到的任何实例变量,都是属于程序中该位置的当前对象self。

第一个@var是属于类A的,因此在创建类之后就执行了,打印出hello。方法中的@var是属于类的实例对象的,因此在创建A的实例对象之后调用方法,打印出world。这两个@var完全无关。任何对象都可以有实例变量--它的信息和对象状态的私有存储处。

ruby中的self的更多相关文章

  1. 谈谈Ruby中的类变量

    Ruby中的类变量,很多文章都是不太建议使用的,主要原因在于他的一些特性容易导致犯一些错误,尤其在广泛使用元编程的时候. 初步接触类变量可能觉得他跟C++的类静态成员和Java中的静态变量没什么区别, ...

  2. [翻译]理解Ruby中的blocks,Procs和lambda

    原文出处:Understanding Ruby Blocks, Procs and Lambdas blocks,Procs和lambda(在编程领域被称为闭包)是Ruby中很强大的特性,也是最容易引 ...

  3. 理解Ruby中的作用域

    作用域对于Ruby以及其它编程语言都是一个需要理解的至关重要的基础知识.在我刚开始学习ruby的时候遇到很多诸如变量未定义.变量没有正确赋值之类的问题,归根结底是因为自己对于ruby作用域的了解不够, ...

  4. [No000010]Ruby 中一些百分号(%)的用法小结

    #Ruby 中一些百分号(%)的用法小结 #这篇文章主要介绍了Ruby 中一些百分号(%)的用法小结,需要的朋友可以参考下 what_frank_said = "Hello!"#% ...

  5. Ruby中 使用Builder Xml Markup 操作XML

    =begin Ruby中 使用Xml Markup 轻松的对XML文档操作, 项目地址:http://builder.rubyforge.org/ 使用之前我们需要安装Builder xml mark ...

  6. Ruby中Block, Proc, 和Lambda

    Block Blocks就是存放一些可以被执行的代码的块,通常用do...end 或者 {}表示 例如: [1, 2, 3].each do |num| puts num end [1, 2, 3]. ...

  7. ruby中symbol

    Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字. 创建一个 Symb ...

  8. [Ruby学习总结]Ruby中的类

    1.类名的定义以大写字母开头,单词首字母大写,不用"_"分隔 2.实例化对象的时候调用new方法,实际上调用的是类里边的initialize方法,是ruby类的初始化方法,功能等同 ...

  9. Swift中实现ruby中字符串乘法倍增的功能

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在ruby中对于字符串类型我们可以用乘法生成一个指定数 ...

  10. ruby中顶层定义的方法究竟放在哪里?

    ruby中顶层(top level)中定义的方法放在main中,证明如下: self.private_methods(false) #IN TOP LEVEL 那么methods方法究竟是在哪定义的, ...

随机推荐

  1. ps -ef|grep htpd|wd -l

    在Linux下查看Apache的 负载情况,以前也说过,最简单有有效的方式就 是查看Apache Server Status(如何开启Apache Server Status点这里),在没有开启Apa ...

  2. 编程之美 set 21 24点游戏

    题目 输入: n1, n2, n3, n4 (1~13) 输出: 若能得到运算结果为 24, 则输出一个对应的运算表达式 如: 输入: 11, 8, 3, 5 输出: (11-8) * (3*5) = ...

  3. Linux GCC编译使用动态、静态链接库 (转)

    原文出处:http://blog.csdn.net/a600423444/article/details/7206015 在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.s ...

  4. 第三篇:C++ 中的几种初始化

    前言 阅读C++教材时,想必你听过复制初始化,直接初始化,值初始化这三个概念吧.笔者本人常将其混淆,遂在此记录下它们的具体含义以便日后查阅. 复制初始化( copy-initialization ) ...

  5. C#三种字符串拼接方法的效率对比

    C#字符串拼接的方法常用的有:StringBuilder.+.string.Format.List<string>.使用情况不同,效率不同. 1.+的方式 string sql = &qu ...

  6. Objective-C代码学习大纲(5)

    2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍了Objective-C代码,很多名词为台 ...

  7. java的list集合如何根据对象中的某个字段排序?

    转自:http://blog.csdn.net/wangjuan_01/article/details/51351633 List集合按某个字段排序 package wjtest_01; import ...

  8. vue 二级列表折叠面板

    请求出来的数据是二级列表,需要点击一级列表展开相应的二级列表 data(){ return { info: [ {name:'一级菜单1',lists:[{price:1},{price:2}]}, ...

  9. node 同异步处理

    同步:序列执行,需等待 异步:非序列执行,无需等待 node同步处理:读取->输出->完毕(队列式执行) node异步处理:读取->完毕(回调输出)(后两步同时进行,谁先到谁先输出) ...

  10. readAsDataURL

    w http://stackoverflow.com/questions/14069421/show-an-image-preview-before-upload <input type=&qu ...