ruby中的self
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相关推荐
- Ruby中的设计模式
继续 上 节讲述过的Singleton . Proxy 及 Iterator各模式,本节再来考察几个别的设计模式.下面按顺序来考察 Prototype . Template Method 和 Obse ...
- Ruby中的设计模式——《松本行弘的程序世界》
< 设计模式 > 一书是用C++ 和 Smalltalk 介绍模式实例的.看了那些例子,大家都会感觉到,绝大多数的模式用 Smalltalk 实现起来非常简单.这是为什么呢? 因为Smal ...
- Ruby中爬虫的实现
2019独角兽企业重金招聘Python工程师标准>>> Ruby中实现网页抓取,一般用的是mechanize,使用非常简单. 安装 sudo gem install mechaniz ...
- Ruby中的require_relative和require有什么区别?
本文翻译自:What is the difference between require_relative and require in Ruby? Ruby中的require_relative和re ...
- 在Ruby中获取system()调用的输出
本文翻译自:Getting output of system() calls in Ruby 如果我在Ruby中使用Kernel#system调用命令,我该如何获得它的输出? system(" ...
- 为什么在Ruby中使用`rescue Exception =gt; e`样式不好?
本文翻译自:Why is it bad style to `rescue Exception => e` in Ruby? Ryan Davis's Ruby QuickRef says (wi ...
- map(&:name)在Ruby中是什么意思?
我在RailsCast中找到了以下代码: def tag_names@tag_names || tags.map(&:name).join(' ') end 什么是(&:name)在m ...
- 如何在Ruby中写入文件?
我需要从数据库中读取数据,然后将其保存在文本文件中. 我怎么能在Ruby中做到这一点? Ruby中有文件管理系统吗? #1楼 在大多数情况下,这是首选方法: File.open(yourfile, ' ...
- 如何检查字符串是否包含Ruby中的子字符串?
我有一个字符串变量,内容如下: varMessage = "hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n""/my/name/is/balaji.s ...
- Ruby中的多行注释?
如何在Ruby中注释多行? #1楼 =begin (some code here) =end 和 # This code # on multiple lines # is commented out ...
最新文章
- 【学习笔记】分治FFT
- 学习动态性能表(3)--v$sqlv$sql_plan
- SVN Server安装配置
- [转载]VC6下安装STLport-5.2.1
- Winform中使用MQTTnet实现MQTT的服务端和客户端之间的通信以及将订阅的消息保存到文件
- 选数(洛谷P1036题题解,Java语言描述)
- 【GTK】如何得到控件的位置
- php 页面上显示xls文档,phpExcel输出xls文档显示乱码的解决方法
- 众多时间时钟Flash动画素材一键即可获取
- python整数范围_python整数范围
- android 标准时间格式,android开发中关于含有中文字段的格林尼治标准时间的时间格式转换...
- 请假代码java web_学生请假管理系统
- 【Mysql】根据经纬度远近排序
- Air780E小程序远程开关-LuatOS版本
- WIN10 时间同步
- 一个域名可以对应多个IP吗?如何通过DNS实现?
- rancher2.x证书过期
- 制作双足机器人用易拉罐_小小创客 | 用易拉罐做一台平衡车,跑起来太炫酷了吧...
- 从零开始学Linux内核驱动--(二)简单内核模块驱动程序
- 【5G系列】AS层的网络选择(3)——小区重选标准
热门文章
- 滴滴java开发面试题_Java开发经典面试题(十二)
- LeetCode 09. 回文数
- java webview框架_java - Android WebView 无法正常显示网页图表
- jedis watch Java_jedis操作redis的几种常见方式总结
- 谷歌发布android+8.2,谷歌Pixel 2代三款新机齐曝光:骁龙835+Android 8.0
- 什么是SFP光模块?SFP光模块小知识介绍!
- 可网管交换机与非网管交换机的区别
- 光纤收发器一定要成对使用吗?
- 【渝粤教育】国家开放大学2018年春季 8634-21TAndroid智能手机编程 参考试题
- 【渝粤教育】国家开放大学2018年春季 0579-22T电路及磁路(2)(一) 参考试题