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
  1. Public(公有)方法可以被任何人调用,没有限制访问控制。方法默认是public的(initialize除外,它是private的)
  2. Protected(保护)方法只能被定义了该方法的类或其子类的对象所调用。整个家族均可访问
  3. 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操作符)可以做到这一点

时间: 2024-11-25 06:32:08

Programming Ruby 阅读笔记的相关文章

Ruby学习笔记

Ruby学习笔记 Ruby语言中,以对象为基本单位,可以说所有的元素都是对象.按照之前对于面向对象程序的理解,对象是指包含了特定属性和方法集合的一组程序.对象由类来定义,具体的表现为对象实例.也就是说,对象是类的实例化[2]. Ruby语言的基础元素 对象:数值对象.字符串对象.正则表达式对象.时间对象.文件对象.目录对象.数组.哈希.例外对象等 数值对象   由于Ruby中一切数据都是对象,所以我们处理的数字实际上也是对象. a = 10,这样一个简单的赋值语句,实际上应当理解为 a = Nu

IceFig阅读笔记

嗯:就是这里了 http://research.worksap.com/research/icefig/ 一下阅读笔记: 嗯,时间有限,他们提供的又茫茫多,所以 就找出来了 几个 单独聊聊吧. 其他语言的看不太懂,所以跳过了部分,直接进入 有关java的部分. 分别是 http://research.worksap.com/research/junit4/ http://research.worksap.com/research/java-dc-listopslib/ http://resear

《构建之法阅读笔记02》

这次主要对<构建之法>的第四章“两人合作”作一次阅读笔记. 首先是代码规范问题. 我过去对于代码规范问题并没有做到注意.在编程中,许多变量和函数的命名都非常的简单而没有实际的意义.而且编程时不注意对齐缩进.很多时候也不加注释,导致对这些简单的变量名称不熟悉. 这样做会使得很多人读代码费劲,甚至是自己都要花时间再次阅读懂自己的代码.而且很多没必要的注释也会使得注释失去意义.当自己再次在原基础上编程时,可能要重新编程等问题. 因此,通过阅读“代码规范”,我找到一些解决方法.代码的风格要简明.易读.

《代码阅读方法与实践》阅读笔记之二

时间过得真快,一转眼,10天就过去了,感觉上次写阅读笔记的场景仿佛还历历在目.<代码阅读方法与实践>这本书真的很难写笔记,本来我看这本书的名字还以为书里大概写的都是些代码阅读的简易方法,心想着这就好写笔记了,没想到竟然好多都是我们之前学过的东西,这倒让我有点无从下手了.大概像我们这些还没有太多经历的大学生,总是习惯于尽量避免自己的工作量,总是试图找到一些完成事情的捷径吧.总之,尽管我不想承认,但我自己心里很清楚,我就是这种人.下面开始言归正传,说说接下来的几章内容归纳. 这本书在前面已经分析了

《大道至简》阅读笔记1

<大道至简>阅读笔记1 不知不觉间看完了第一章,从这个章节里我看到了一些我们都明白可是却自己很难做到的道理. 书中从愚公移山的故事和编程相结合给出了编程的精义就是顺序.分支.循环,这些都是我们所熟悉的,也是老师在教学中耳提面命的,可是我们又有几个人能做到呢. 我们总是在找着各种各样的学不好学不会理由,“它太难了”,“我太笨了”,认真的想一想难道真的是它太难了或者是自己太笨了么?不,答案是否定的,追根究底是懒惰,是没能坚持.从根本上来说,不存在会不会写程序的问题,除了先天智障和后天懒惰者,这要你

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

构建之法阅读笔记05

2017.5.20 今天阅读的是<构建之法>第8章需求分析的阅读笔记,我们如果要开始做一个软件,最先要进行的就是需求分析,我们应该充分的了解我们这个软件是否具有前景,我们为用户提供的服务是不是用户所需要的,这一章详细的叙述了如何进行需求分析. 首先是获取和引导需求,我们应该找到软件的利益相关者,了解挖掘他们对软件的需求,引导他们表达出真实的需求.然后分析和定义需求,对各个方面的需求进行规整,定义需求内涵,从各个角度将需求量化,然后估计实现这些需求所需要的时间和资源,确定各个需求的优先级.紧接着

《构建之法》阅读笔记(2)

<构件之法>阅读笔记2 看了前面两章,我感觉我现阶段距离一个程序员还很远,软件工程师更是遥不可及.在学校的我学习了很多,如c++,数据结构,面向对象--学的多而不精,纵观现在我就是一个盲目学习的学生,上课时认真听了课后却没有花更多的时间去研究,遇到不懂的容易掉价死胡同,总是花很多时间闷闷思考,不到最后都没有去请教同学,去百度.看着其他很厉害的同学,自己就只能在一旁羡慕嫉妒恨.那现在在怎么样才能将自己对编程的兴趣提高,加强自己的编程思想?提高自己的价值?能够尽早地迈进程序员.软件工程师的行列之中

01软件构架实践阅读笔记之一

软件构架实践是我们下学期要学习的一本书,所以我想将这本书作为我阅读笔记的一本书. 在这本念书的第一章是总序,在其中提到: 1.所谓"正确的"就是在指功能.性能和成本几个方面都能满足用户要求且无缺陷: 2.所谓"无缺陷"就是在指编码后对软件系统进行彻底的穷举测试修复了所有的缺陷,保证所编写的代码本身不存在缺陷: 但是我们知道编写一个软件,并不可能很好的达到这种的效果,所以应该做到作者提到的"创造.应用.和推广"战略.但是我存在这样的问题: 1.创造