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完全无关。任何对象都可以有实例变量--它的信息和对象状态的私有存储处。

转载于:https://www.cnblogs.com/smallbottle/p/3854116.html

ruby中的self相关推荐

  1. Ruby中的设计模式

    继续 上 节讲述过的Singleton . Proxy 及 Iterator各模式,本节再来考察几个别的设计模式.下面按顺序来考察 Prototype . Template Method 和 Obse ...

  2. Ruby中的设计模式——《松本行弘的程序世界》

    < 设计模式 > 一书是用C++ 和 Smalltalk 介绍模式实例的.看了那些例子,大家都会感觉到,绝大多数的模式用 Smalltalk 实现起来非常简单.这是为什么呢? 因为Smal ...

  3. Ruby中爬虫的实现

    2019独角兽企业重金招聘Python工程师标准>>> Ruby中实现网页抓取,一般用的是mechanize,使用非常简单. 安装 sudo gem install mechaniz ...

  4. Ruby中的require_relative和require有什么区别?

    本文翻译自:What is the difference between require_relative and require in Ruby? Ruby中的require_relative和re ...

  5. 在Ruby中获取system()调用的输出

    本文翻译自:Getting output of system() calls in Ruby 如果我在Ruby中使用Kernel#system调用命令,我该如何获得它的输出? system(" ...

  6. 为什么在Ruby中使用`rescue Exception =gt; e`样式不好?

    本文翻译自:Why is it bad style to `rescue Exception => e` in Ruby? Ryan Davis's Ruby QuickRef says (wi ...

  7. map(&:name)在Ruby中是什么意思?

    我在RailsCast中找到了以下代码: def tag_names@tag_names || tags.map(&:name).join(' ') end 什么是(&:name)在m ...

  8. 如何在Ruby中写入文件?

    我需要从数据库中读取数据,然后将其保存在文本文件中. 我怎么能在Ruby中做到这一点? Ruby中有文件管理系统吗? #1楼 在大多数情况下,这是首选方法: File.open(yourfile, ' ...

  9. 如何检查字符串是否包含Ruby中的子字符串?

    我有一个字符串变量,内容如下: varMessage = "hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n""/my/name/is/balaji.s ...

  10. Ruby中的多行注释?

    如何在Ruby中注释多行? #1楼 =begin (some code here) =end 和 # This code # on multiple lines # is commented out ...

最新文章

  1. 【学习笔记】分治FFT
  2. 学习动态性能表(3)--v$sqlv$sql_plan
  3. SVN Server安装配置
  4. [转载]VC6下安装STLport-5.2.1
  5. Winform中使用MQTTnet实现MQTT的服务端和客户端之间的通信以及将订阅的消息保存到文件
  6. 选数(洛谷P1036题题解,Java语言描述)
  7. 【GTK】如何得到控件的位置
  8. php 页面上显示xls文档,phpExcel输出xls文档显示乱码的解决方法
  9. 众多时间时钟Flash动画素材一键即可获取
  10. python整数范围_python整数范围
  11. android 标准时间格式,android开发中关于含有中文字段的格林尼治标准时间的时间格式转换...
  12. 请假代码java web_学生请假管理系统
  13. 【Mysql】根据经纬度远近排序
  14. Air780E小程序远程开关-LuatOS版本
  15. WIN10 时间同步
  16. 一个域名可以对应多个IP吗?如何通过DNS实现?
  17. rancher2.x证书过期
  18. 制作双足机器人用易拉罐_小小创客 | 用易拉罐做一台平衡车,跑起来太炫酷了吧...
  19. 从零开始学Linux内核驱动--(二)简单内核模块驱动程序
  20. 【5G系列】AS层的网络选择(3)——小区重选标准

热门文章

  1. 滴滴java开发面试题_Java开发经典面试题(十二)
  2. LeetCode 09. 回文数
  3. java webview框架_java - Android WebView 无法正常显示网页图表
  4. jedis watch Java_jedis操作redis的几种常见方式总结
  5. 谷歌发布android+8.2,谷歌Pixel 2代三款新机齐曝光:骁龙835+Android 8.0
  6. 什么是SFP光模块?SFP光模块小知识介绍!
  7. 可网管交换机与非网管交换机的区别
  8. 光纤收发器一定要成对使用吗?
  9. 【渝粤教育】国家开放大学2018年春季 8634-21TAndroid智能手机编程 参考试题
  10. 【渝粤教育】国家开放大学2018年春季 0579-22T电路及磁路(2)(一) 参考试题