Programming Ruby 阅读笔记
- 在Ruby中,通过调用构造函数(constructor)来创建对象
song1=Song.new("Ruby")
- Ruby对单引号串处理的很少,除了极少的一些例外,键入到字符串字面量的内容就构成了这个字符串的值。
Ruby对双引号字符串游更多地处理。首先,它寻找以反斜线开始的序列,并用二进制值替换它们。其次是字符串内的表达式内插,#{表达式}序列会被“表达式”的值替换。
- $greeting="Hello" # $greeting是全局变量
- @name="Prodence" # @name是实例变量
- Ruby 使用一种命名惯例来区分名称的用途:名称的第一个字符显示这个名称如何被使用。局部变量、方法参数和方法名称都必须以小写字母或下划线开始。全局变量都有$为前缀,实例变量以@符号开始,类变量以@@符号开始。类名称、模块名称和常量必须以一个大写字母开始。
- 许多语言中nil(或null)的概念是指“没有对象”, 在Ruby中,这是不一样的:nil是一个对象,与别的对象一样,只不过它是用来表示没有任何东西的对象。
- a = %w{ant bee cat dog} 等价于下面的表达方式
- a= ['ant','bee', 'cat' ,'dog']
- 正则表达式只是一种指定字符模式的方法,这个字符模式会在字符串中进行匹配。在Ruby中,通常在斜线之间(/pattern/)编写模式来创建正则表达式。
- Block:
def call_block
puts "Start of method"
yield
yield
puts "End of method"
end
call_block {puts "In the block"}
Result:
Start of method
In the block
In the block
End of method
使用block来实现迭代器:迭代器是从某种收集如数组中连续返回元素的方法
animals= %w(ant bee cat dog elk)
animals.each{|animal| puts animal}
Result:
ant
bee
cat
dog
elk
- 类
class Song
def initialize(name, artist, duration)
@name=name
@artist=artist
@duration=duration
end
end
song=Song.new("Bicyclops","Fleck",260)
puts song.inspect
Result:
#<Song:0x00000002eca6d8 @name="Bicyclops", @artist="Fleck", @duration=260>
inspect方法(可以发送给任何对象)默认将对象的ID和实例变量格式化。
- 一个对象的外部可见部分被称为其属性(attribute)
class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist,duration)
@lyrics=lyrics
end
def to_s
"KS: #{@name}--#{@artist} (#{@duration}) {#{@lyrics}}"
end
attr_reader :name, :artist, :duration, :lyrics # Attributs setting method 2
def name #Attribute setting method 1
@name
end
def artist
@artist
end
end
song=KaraokeSong.new("Bicyclops","Fleck",260,"And now,the...")
puts song.artist
- 当调用super而不使用参数时, Ruby向当前对象的父类发送一个消息,要求它调用子类中的同名方法
- Object的实例方法
- 可写的属性:
方法一: 创建一个名字以等号结尾的方法
方法二:attr_writer
- 虚拟属性 Virtual Attributes
上面的示例中使用属性方法创建了一个虚拟的实例变量。对外部世界来说,duration_in_minutes就像其他属性一样。然而,在内部它没有相应的实例变量。
- 属性、实例变量及方法
属性就是一个方法。某些时候,属性简单地返回实例变量的值。某些时候,属性返回计算后的结果。并且某些时候,那些名字已等号结尾的方法,被用来更新对象的状态。
当设计一个类的时候,决定其具有什么样的内部状态,并决定这内部状态对外界的表现形式。内部状态保存在实例变量中。通过方法暴露出来的外部状态,我们称之为属性。类可以执行的其他动作,就是一般方法。
- 类变量:类变量以两个@符开头,与全局变量和实例变量不同,类变量在使用之前必须被初始化,通常,初始化就是在类定义中的简单赋值
- 类方法,不束缚于任何特定对象的方法。
new方法创建一个新的类对象,但是new方法本身并不与一个特定的对象相关联。
类方法和实例方法是通过它们的定义区别开来的: 通过在方法名之前放置类名以及一个句点,来定义类方法
- 访问控制 Access Control
- Public(公有)方法可以被任何人调用,没有限制访问控制。方法默认是public的(initialize除外,它是private的)
- Protected(保护)方法只能被定义了该方法的类或其子类的对象所调用。整个家族均可访问
- Private(私有)方法不能被明确的接收者调用,其接收者只能是self。这意味着稀有方法只能在当前对象的上下文中被调用;你不能调用另一个对象的私有方法
另外,可用通过将方法名作为参数列表传入访问控制函数来设置它们的访问级别
- 变量
变量是一个对象吗?在Ruby中,答案是‘不’。变量只是对象的引用。对象漂浮在某处一个很大的池中(大多数时候是堆,即heap中),并由变量指向它们
可以通过使用String的dup方法来避免创建别名,它会创建一个新的、具有相同内容的String对象
可以通过冻结一个对象来阻止其他人对其进行改动。试图更改一个被冻结的对象,Ruby将引发一个TypeError异常
- 容器(Continuers):是指含有一个或多个对象引用的对象
数组类含有一组对象引用。每个对象引用占据数组中的一个位置,并由一个非负的整数索引来标识
数组有[]操作符来进行索引。和Ruby的大多数操作符一样,它实际上是一个方法(Array类的一个实例方法),因此可以被子类重载。使用非负整数访问数组,将会返回处于该整数位置上的对象,如果此位置上没有对象,则返回nil。使用负整数访问数组,则从数组末端开始计数
可以使用一对数字[start, count]来访问数组,这将返回一个包含从start还是的count个对象引用的新数组
还可以使用range来对数组进行索引,其开始和结束位置被两个或3个点分隔开。两个点的形式包含结束位置,而3个点的形式不包含
[]操作符有一个相应的[]=操作符,他可以设置数组中的元素。如果下标是单个整数,那么其位置上的元素将被赋值语句右边的东西所替换。造成的任何间隙由nil来填充
- 散列表 Hashes
也成关联数组、图、词典。Hash可以用任何类型的对象来进行索引,比如字符串、正则表达式等等。当你将一个值存入Hash时,需要提供两个对象,一个是索引(通常称为键(key)),另一个是值。
- Block
首先, block在代码中只和方法调用一起出现;block和方法调用的最后一个参数处于同一行,并紧跟在其后(或者参数列表的右括号的后面)
其次, 在遇到block的时候,并不立即执行其中的代码。Ruby会记住block出现时的上下文(局部变量、当前对象等),然后执行方法调用
在block定义中,参数列表位于两个竖线(管道符)之间, block可以有人以数量的参数
返回低于某个值的所有Fibonacci数列项:
如果传递给block的参数是已经存在的局部变量,那么这些变量即为block的参数,它们的值可能会因block的执行而改变。同样的规则适用于block内的变量:如果它们第一次出现在block内,那么它们就是block的局部变量。相反,如果它们先出现在block外,那么block就与其外部环境共享这些变量
Defined? 方法在其参数没有定义时返回nil
inject迭代器:让你可以遍历收集的所有成员以累计出一个值
inject是这样工作的:block第一次被执行时,sum被置为inject的参数,而element被置为收集的第一个元素。接下来每次执行block时,sum被置为上次block被调用时的返回值。inject的最后一次调用block返回的值。如果inject没有参数,那么它使用收集的第一个元素作为初始值,并从第二个元素开始迭代。
- 闭包(closure)
- 数字
一定范围内的整数
在内部以二进制形式存储,它们是Fixnum类的对象,范围之外的整数存储在Bignum类的对象
Ruby 会自动管理它们之间的来回转换。
在书写整数时,可以使用一个可选的前导符号,可选的进制指示符(0表示八进制,0d表示十进制[默认], 0x表示十六进制或者0b表示二进制),后面跟一串符合适当进制的数字。下划线在数字串中被忽视。
所有整数都是对象,并且可以对各种形式的消息作出响应。Ruby使用num.abs而不是abs(num)去得到数字的绝对值
整数支持的几种有用的迭代器:
注意downcase方法名称结尾处的感叹号, 这个标识用来表示方法会在适当的位置修改接收者,在这个例子中,它把字符串变成小写
- 区间
1. 区间的第一个且最可能最自然的用法是:表达序列。在Ruby中,使用“..”和“...”区间操作符来创建序列。两个点的形式是创建闭合的区间(包括右端的值),而3个点的形式是创建半闭半开的区间,不包括右端的值
<=>太空船操作符,它比较两个值,并根据第一个值是否小于、等于、大于第二个值,分别返回-1,0,+1
2. 区间作为条件:在这里它们表现的就像某种双向开关 - 当区间第一部分的条件为为true时,它们就打开,当期间第二部分的条件为true时,它们就关闭。例如下面的代码段,打印从标准输入得到的行的集合,每组的第一行包含start这个词,最后一行包含end这个词
3. 区间作为间隔: 看看一些值是否会落入区间表达的间隔内。使用===(case equality操作符)可以做到这一点
Programming Ruby 阅读笔记的更多相关文章
- the C programming language 阅读笔记1
读了一遍著名的<the C programming language>,果然如听说的一样,讲解基础透彻,案例简单典型,确实自己C语言还有很多细节点不是很清楚. 总结一下阅读的收获(部分原书 ...
- the C programming language 阅读笔记2
1. 指针 1.1 自增符的使用 ++*p;//p指向的内容加一 (*p)++; //p指向的内容加一 *p++;//p本身自增 *++p; //p本身自增 因为诸如*和++这样的一元运算符在表达式求 ...
- 《Multiplayer Game Programming》阅读笔记
在图书馆发现一本<网络多人游戏架构与编程>-- Joshua Glazer, Sanjay Madhav 著.书挺新的,17年出版的,内容很有趣,翻一翻可以学到不少在<计算机网络&g ...
- Mongodb Manual阅读笔记:CH3 数据模型(Data Models)
3数据模型(Data Models) Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mon ...
- IceFig阅读笔记
嗯:就是这里了 http://research.worksap.com/research/icefig/ 一下阅读笔记: 嗯,时间有限,他们提供的又茫茫多,所以 就找出来了 几个 单独聊聊吧. 其他语 ...
- Ruby零碎笔记
Ruby零碎笔记 飞机上阅读pdf的笔记,因为不联网,内容不多而且比较零散,以tips的形式记录 tips 查看当前作用域的变量 puts local_variables ruby中方法传递参数时,括 ...
- 阅读笔记 1 火球 UML大战需求分析
伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本 <火球 UML大战需求分析>,首先 ...
- [阅读笔记]Software optimization resources
http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++ 7. The efficiency of differe ...
- 《uml大战需求分析》阅读笔记05
<uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...
随机推荐
- Discuz X3游客看小图功能导致文字内容隐藏的【修复方法】
如果帖子内容以图片开始,并且开启了游客看小图功能,那么图片下面的文字也会被隐藏,这是不科学的(在图片上边的文字不会被隐藏)查看DZ源代码,发现是程序猿疏忽漏掉了</div> 下边1314学 ...
- IDEAL葵花宝典:java代码开发规范插件 (maven helper)解决maven 包冲突的问题
小编说到: 在我们日常开发当中常常我们会遇到JAR包冲突.找来找去还找不到很是烦人.那么所谓的JAR包冲突是指的什么那?JAR包冲突就是-引入的同一个JAR包却有好几个版本. 例如: 项目中引用了两个 ...
- smack
XMPP/Smack/Openfire javax.net.ssl.SSLException: Received fatal alert: internal_error 解决: 1.在链接openfi ...
- Seq2SQL :使用强化学习通过自然语言生成SQL
论文: https://einstein.ai/static/images/layouts/research/seq2sql/seq2sql.pdf 数据集:https://github.com/s ...
- java.sql.SQLException: Access denied for user 'Administrator'@'localhost' (using password: YES)
早上在做MyBatis+Spring整合的时候爆了个奇葩的bug: 十月 19, 2017 11:18:11 上午 org.springframework.context.support.Abstra ...
- unicode和utf-8互转
1.1 ASCII码 我们知道, 在计算机内部, 所有的信息最终都表示为一个二进制的字符串. 每一个二进制位(bit)有0和1两种状态, 因此八个二进制位就可以组合出 256种状态, 这被称为一个字节 ...
- MongoDB主从复制,主主复制
MongoDB主从复制,是不需要像mysql那样从数据库事先要完整的主数据快照背景介绍:mongodb支持一主一从或多从复制1) master节点: mongod --dbpath=/usr/M ...
- Spring 源码解析之DispatcherServlet源码解析(五)
spring的整个请求流程都是围绕着DispatcherServlet进行的 类结构图 根据类的结构来说DispatcherServlet本身也是继承了HttpServlet的,所有的请求都是根据这一 ...
- JavaScript:bootstrap 模态框的简单应用
最近用上了bootstrap这个强大的前端框架,有空来总结一下.这里记录下模态框的简单应用. 首先,要在页面中引入相应的js.css文件 <link href="css/bootstr ...
- 虚拟机ubuntu和windows共享文件
设置虚拟机ubuntu和windows共享文件(方便复制文件到本机) (需要安装samba) 登陆ubuntu系统后,点击左边的文件夹.右击新建个文件夹. 设置为共享 ubuntu会提示你 ...