空愁居@十万图纸.军史资料
Would you like to react to this message? Create an account in a few clicks or log in to continue.

programming ruby 2nd学习笔记

向下

programming ruby 2nd学习笔记 Empty programming ruby 2nd学习笔记

帖子 由 Admin 周六 四月 14, 2012 5:26 am

本文是我学习programming ruby
2nd的笔记,由于我熟悉的语言是java,python,所以会在其中夹杂一些ruby与java,python的比较,文中的其他语言一律指
java,python。格式按原文的顺序,我只是按我阅读的顺序来更新本文,若没时间,更新会很慢。

好像我的电子文档有问题,不少目录结构不正确。
第一版序言



Ruby创始人的序言
第二版序言



还是Ruby创始人的序言
前言



一些废话,不过看了可以增加一下见识J
路标



这本书主要分成四部分:

l Ruby的方方面面:语法级别的详细说明

l Ruby设置:对于ruby SDK命令行,以及配套工具使用说明

l Ruby详细:对ruby语言的关键点详细说明

l Ruby参考手册:比较完整的参考手册,差不多占了本书的一半篇幅



作者建议了各种不同类型的读者的阅读方式:

l 如果你是个初学者:你最好从第一部分的教材开始,把库参考放在手边,你就可以写程序了。

l
如果你已经精通Perl,Python,Java或者Smalltalk,你可以从第1章开始,熟悉了ruby安装与运行后,然后阅读第2章关于
ruby基本特性的介绍,接着你可以采取较慢的方法(按顺序阅读),或者略过这些详细说明,直接跳到第三部分的高级部分,最后参看第四部分的库参考。

l 专家、大师、和那些“我讨厌冗长的教材”的人可以直接跳到到第22章的语言参考,然后翻一下第四部分得库参考,然后把这本书作为一个咖啡杯垫。
ruby的方方面面


开始



安装ruby

运行ruby

Ruby文档:RDoc与ri
ruby新手上路
ruby是一门面向对象语言

每种语言都宣称自己是OO语言,只是不同的支持方式,java说自己比C++来的更OO,更简单;python说自己比java更”对象”,就连方法都是
对象。但关键一点是,编译型的语言不能直接拿来跟python等动态语言相比,很多特征没有可比性,尤其是对OO特征的比较。总之,不能为了那个”纯”,
而让编码很难受,可以参看原文作者的辩解J
ruby的一些基本知识

1. 不需要在行尾加上分号,一行一个语句



2. Ruby注释开始于#号,结束在行尾,缩排没有特殊意义,就是每行的开头不缩行,不过为了可读性,不建议这样做



3. 方法是由关键字def来定义的,紧跟着方法的名字。Ruby不使用大括号来划定复合语句和定义的界限,而是简单地用关键词end来结束它们



4. 函数调用可以不用括号,但是,优先规则会使哪个参数被哪个方法使用变得复杂,所以我们建议除了极简单的情况,还是使用圆括号为好

5. 单引号与双引号之间的不同是Ruby在转换字面值到字符串对象时所处理的数量,单引号的情况下会少。除了一些例外,字符串字面值就是字符串的值。

6.
双引号的情况下,Ruby要做更多的处理,首先,把反斜杠开头的字符替换成二进制值。最常见的是"/n"(被替换成换行符);第二点,Ruby要修改双
引号括住的字符串,字符串中的#{表达式}序列要用表达式的值来替换(如果表达式是一个简单的全局变量、实例或者类变量,那么就不必写出大括号)

7. Ruby方法的返回值默认是最后被求的表达式的值(不过,我觉得这没什么好处)

8. 命名约定:

l 名字前面的第一个字符表明这个名字的用法,局部变量、方法参数和方法名称应该用一个小写字母开头或者一个下划线;

l 全局变量用美元符作为前缀($),而实例变量用@开头,类变量用两个@开头;

l 最后,类名、模块名和常量应该大写字母开头。

l 词首字母后面可以是字母、数字和下划线的任意组合(规则规定,@后面不可以直接跟数字)
数组与hash

1. Ruby的数组和哈希是有序集合(注意在java中,hash有无序的实现类,也有有序的;python与ruby一样)



2. 创建空数组两个方法: empty1 = []; empty2 = Array.new



3. 对于创建字符串的数组,可以使用快捷方式%w: a = %w{ ant bee cat dog elk },输出结果: ["ant", "bee", "cat", "dog", "elk"]



4. hash的创建与python一样,使用大括号”{}”,可能都是动态语言的缘故吧



5. 如果使用一个不存在的键来索引哈希,默认返回nil。正常情况下这是很方便的,因为nil用在条件表达式中就是false。



6. 创建一个新的空的哈希时改变默认值是很容易的,比如:histogram = Hash.new(0)





总之,ruby中这两个对象的使用方式与python差不多一样


控制结构

1. Ruby包括所有常见的控制结构,这些结构的主体周围缺少了大括号,在Ruby中使用end关键字表示一段主体的结束



2. 如果if语句或者while语句的主体是一个简单的表达式,可以使用Ruby语句修饰符来代替。简单地写下这个表达式,后面跟上if或者while和条件语句。例如:

l 通用形式:

if radiation>3000
puts "Danger,Will Robinson"
end

l 修饰符形式:



puts "Danger,Will Robinson" if radiation>3000


正则表达式

与其他语言没什么区别,可以参看《Mastering Regular Expressions》,国内已经影印出版了
代码块与迭代器

1. 代码块:可以和方法调用关联的一系列代码,就好像这些代码是方法的参数一样,把代码块和方法当成是协同工作的关系,在它们之间控制在来回交换。



2. 用Ruby的yield语句能够调用代码块一次或者更多次。



3. 贯穿整个Ruby库,到处都是使用代码块来实现迭代器。迭代器是一种用来连续返回某种集合所有元素的方法,比如一个数组。
读取与’Riting

1. Ruby带着很完善的I/O库



2. puts把它的所有参数写出来,每一个都加入一个新行;print也写出它的参数,不过没有新行。它们两个都能向任意的I/O对象写入,不过默认是写入控制台;printf按格式输出参数(就像C或者Perl的printf)。

3. 有很多种方式来把输入读取到你的程序中,最传统的就是使用gets例程,它从你的程序的标准输入流中返回下一行。

4. 可以参看原文中的关于$_与ARGF的讨论,很有收获


继续前进

本章是一个对ruby语言的基本特性的快速浏览
类,对象,变量

1. Ruby中使用class来定义类,构造方法是initialize,可以带参数。Java中是与类同名的方法,python中是__init__方法。



2. 使用类的new默认方法来构造对象,可以传递参数。比如:



aSong = Song.new("Bicylops", "Fleck", 260)


继承与消息

Ruby使用”<”来表示继承关系,java使用extends, 而python使用()


对象与属性

1. 这两个概念与一般OO语言没什么本质的区别



2. ruby是单继承语言,但是ruby提供了一种达到多继承效果的功能:混合(Mixins),而没有多继承的缺点



3. Ruby提供了简便方式来创建属性读取与写入方法:attr_reader与attr_writer 。示例:



class Song
attr_reader :name, :artist, :duration
end



class Song
attr_writer :duration
end



4. 可写属性不象在java中使用setter方法来设置,可以直接通过点号(.)来访问,就像本地变量一样。

5. Ruby还提供了虚拟属性的概念,定义方式与方法定义一样,只是返回的值是通过其他变量计算得来的,不存在与该变量的实际对应得实例变量
类变量与类方法

ruby认为类变量是私有的,只有通过方法才能访问。

类方法的定义方式是在方法名前加上类名或者self,后面加上点号(.)
访问控制

与大多数语言一样,ruby提供了3种访问控制方式:

公有方法pubic methods 可以被任何对象调用,不存在访问控制。方法默认都是公有的(initialize除外,它永远是私有的)。
保护方法protected methods 可以被定义它的类和其子类的对象访问,访问只限于家族内。
私有方法private methods 不能被外界调用,因为调用私有方法时无法指定对象,所以只能在定义它的类和类直接派生的对象中使用
变量

变量不是对象,对象在一个大的池子中,变量仅仅是这些对象的一个引用。这些概念与其他语言都是一样的。
容器,代码块,迭代器



容器

代码块与迭代器

到处都是容器
标准类型



数字

字符串

范围

正则表达式
方法的深入探讨



定义一个方法

调用一个方法
表达式



操作符表达式

各种表达式

赋值

条件执行

Case表达式

循环

变量作用范围,循环与代码块
异常,捕获,抛出



异常类

处理异常

抛出异常

捕获与抛出
模块



名称空间

混合

迭代器与Enumerable模块

组合模块

包含其他文件
基本输入输出



什么是一个IO对象

打开与关闭文件

读取与写入文件

与网络对话
线程与进程



多线程

控制线程的调度器

相互隔离

运行多进程
单元测试



Test::Unit框架

构造一个测试

组织与运行测试
遇到麻烦时



Ruby调试器

交互式Ruby

编辑器支持

但是程序还是不对!

但是程序太慢了!
Ruby设置


14.Ruby的世界


命令行参数

标准命令行格式:ruby [ options ] [-- ] [ programfile ] [ arguments ]



若没有文件名,或者文件名为”-”(中划线),ruby从命令行读取源文件



例如:% ruby -w – “Hello World”


程序退出

Kernel#exit用来退出程序,返回一个操作系统状态值,不像别的语言的exit立刻退出程序,Kernel#exit在退出之前抛出SystemExit异常,你可以捕获这个异常,进行一些清理工作


环境变量

你可以通过预定义的变量ENV来访问环境变量,ENV一个hash类型的变量

环境变量可以修改,但是这种修改只对当前进程有效

Ruby使用的环境变量有下面几种:

变量名称


描述

DLN_LIBRARY_PATH






动态加载模块的路径

HOME






当前用户的主路径,在扩展路径时,用来替换路径中的”~”符号

LOGDIR






假如没有设置$HOME,指向用户主路径。只有Dir.chdir使用这个变量

OPENSSL_CONF






OpenSSL的的配置文件路径





RUBYLIB






Ruby程序的附加搜索路径($SAFE必须为0)

RUBYLIB_PREFIX






仅仅适用于windows平台,通过加上前缀,来分散RUBYLIB的搜索路径





RUBYOPT






Ruby的附加命令行选项。在真正命令行选项被解析后开始检测($SAFE必须为0)

RUBYPATH






用-S选项, ruby程序的搜索路径(默认市PATH)

RUBYSHELL






在windouws下,这个SHELL用来打开一个进程。若没有设置,将检测SHELL或COMSPEC。





RUBY_TCL_DLL






用来覆盖TCL共享库的默认名

RUBY_TK_DLL






用来覆盖TK共享库的默认名,这与RUBY_TCL_DLL必须任意设置一个
Ruby寻找模块的位置

察看寻找模块循序的命令:

% ruby –e 'puts $:'

在windows上运行上面的命令,输出如下:

d:/ruby/lib/ruby/site_ruby/1.8

d:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt

d:/ruby/lib/ruby/site_ruby

d:/ruby/lib/ruby/1.8

d:/ruby/lib/ruby/1.8/i386-mswin32

site_ruby包含模块与扩展。

$:是放置加载文件的数组。
编译环境

当为特定平台编译ruby程序时,就需要使用rbconfig.rb文件中的Config模块
交互设的ruby shell


命令行

标准命令行格式:irb [ irb-options ] [ ruby_script ] [ program arguments ]

可选项(略)

irb的关键用处是验证代码,可以参见英文书中的精彩测试代码

l tab补全(Tab Completion)

这是在irb命令下的代码补全方式,在你输入几个字母后,连续按两次tab键,irb会输出所有已这几个字母开头的函数名或当前变量名。irb会尽快帮你
补全单词的,有时在你按了一次tab时,它就会寻找是否有匹配的,若有好多个单词,它会根据你每次按tab时,帮你分段补全



l 子会话(Subsession)

Irb支持支持多个并发的会话

l 子会话与绑定(Subsessions and Bindings)

Todo


配置

Irb是高度可配置的,可以用命令行选项,或者配置文件

l 初始化文件

l 扩展irb

l 交互式配置

l Irb交互式配置选项
命令

在irb提示符下,你可以打一些ruby表达式来查看结果,详细命令如下

exit, quit, irb_exit, irb_quit



conf, context, irb_context

cb, irb_change_binding < obj >

irb < obj >

jobs, irb_jobs

fg n, irb_fg n

kill n, irb_kill n

配置提示符


约束

由于irb的工作方式,它与标准ruby解释器有些不兼容。问题主要是本地变量的赋值

这是由动态语言的特性造成的,比如eval ”var=1”,在irb中只能等所有行都读入才执行得出var的值,具体可以参看英文版。
rtags和xmp

这主要是一些小工具,没多少用处
文档化ruby



给ruby代码添加RDoc

给C语言扩展添加RDoc

运行RDoc

显示程序用法
使用RubyGems来管理包



安装RubyGems

安装应用程序Gems

安装和使用Gem库

创建你自己的Gems
Ruby与web



写CGI脚本

Cookies

提升性能

Web服务器的选择

SOAP与Web Service

更多信息
运行TK



简单TK程序

窗口

绑定事件

画布

滚动条

从Perl/TK文档翻译
Ruby与微软windows



获得windows平台上的ruby

在Windows下运行Ruby

Win32API

Windows自动化
扩展Ruby



你的第一个程序

C语言中Ruby对象

Jukebox扩展

内存分配

Ruby类型系统

创建一个扩展

嵌入一个Ruby解释器

嫁接Ruby到其他语言

Ruby C语言API
Ruby详细


Ruby语言

这章是从底向上来讲解ruby语言。大多数内容只是语言的语法和语义,没有讲解内置类与模块。然而,有时ruby把一些其他语言级别的特性放在标准库中实现。
源代码布局

Ruby是面向行的语言,一般来讲一行只可以有一条表达式,若想写多个表达式,可以使用”;”来隔开;对于一条表达式分成多行的情况,若在换行的行尾没有任何操作符,则可以在换行的行尾添加反斜杆”/”,反之,什么都不加。

普通分隔符输入

类型


说明

%q


单引号字符串

%Q,%


双引号字符串

%w,%W


字符串数组

%r


正则表达式模式

%x


Shell命令


基本类型

Ruby的基本类型有:数字,字符串,数组,hash,范围,符号,正则表达式
命名
变量与常量
预定义变量
表达式
布尔表达式
If和unless表达式
Case表达式
Loop结构
方法定义
调用一个方法
别名
类定义
模块定义
访问控制
代码块,闭包,Proc对象
异常
捕获与抛出
Duck类型



类不是类型

象duck一样编码

标准协议与强迫

言行一致
类和对象



类和对象是怎么交互的

类与模块的定义

顶级执行环境

继承与可见性

冻结对象
在安全模式下锁定Ruby



安全级别

感染的对象
反射,对象空间和分布式Ruby



寻找对象

寻找类

动态调用方法

系统钩子

追踪你程序的执行

序列化与分布式对象

编译时?运行时?随时?
Ruby参考手册


附录


附录一 Socket库


附录二 MKMF参考


附录三 支持



Web站点

下载站点

新闻组

邮件列表
附录四 参考书目
Admin
Admin
Admin

帖子数 : 641
注册日期 : 08-03-25

http://kcjun.longluntan.cn

返回页首 向下

programming ruby 2nd学习笔记 Empty 回复: programming ruby 2nd学习笔记

帖子 由 Admin 周六 四月 14, 2012 5:26 am

我喜欢Ruby,因为它在我心中是一种优美的程序设计语言;我喜欢读纸版书,因为捧在手里很有感觉;我喜欢读中文版,毕竟中文是我的母语。所以,当《Programming Ruby中文版》面市的时候,我迫不及待的在网上下了订单。

这本书给我的第一印象是“厚”,有如字典一般的外观对于捧在手中的阅读不会是一种非常好的阅读体验,不过,几百页的图书想薄也难啊!不过,整体来说,这本书的制作质量还是相当不错的,让人感觉很舒服,事实上,这本书读起来感觉确实不错,也不枉为它等待如此之长的时间了。

因为已经对Ruby有了一定了解,所以,我读这本书更多的是对知识上的查缺补漏,这样的读书,速度自然也快了许多。所以,很快就把正文中我感兴趣的部分读了一遍。至于后面库的部分,用到的时候再说吧!

这本书几乎算得上Ruby的“圣经”了,无论是厚度还是内容。它几乎涵盖Ruby语言的各个方面。作者在写书方面是老手,所以,很会照顾不同层面的需要:
想了解Ruby,第一部分提供的就是一个简单的教程;想深入语言的细节,第三部分把Ruby语言的方方面面展示了出来……

让我最有感觉的是第24章《类和对象》,之所以这么说,是因为其中把Ruby的对象模型明明白白的摆在了那里,刚好是近来一直在用功的方面,当然看得酣畅
淋漓。相对于语法是形,背后的思想就是神了,而把Ruby的神很好的展现出来的是第23章《Duck
Typing》,如果对象能够像鸭子一样走,像鸭子一样叫,那么就可以把它当作鸭子。更准确的说,这章是从静态语言迈入动态语言所需的真正转换。

如果非要要为这本书找些毛病,我能想到的就是它对Metaprogramming涉及很少,毕竟DSL(Domain Specific
Language)已经越来越受到人们的关注,而Ruby在Metaprogramming上的能力恰好可以在DSL上大有作为,ROR已经为我们很好的
展示了这一点。

对于有些人来说,Ruby就是ROR,但实际上,Ruby要比ROR更为广阔。所以,单纯从学习ROR的角度来读这本书,无疑是有些过了。据说有本
《Ruby For
Rails》很适合为了ROR而学Ruby的人,没读过,仅把把它作为信息列在这。像我们这样通过书来学习新知的人,很重要的就是找对书,因为上错了船而
大骂船的人,真正该骂的是自己。

对于中文版的图书,翻译是一个无可避免的话题。这本书的翻译质量很高,很少出现因为拗口的字句打断阅读的现象。不过,还是有些细微之处存在瑕疵。比如,在346页上,谈及方法定义时,有这样一句话:
方法定义可能不包含类或模块定义。
其原文是
Method definitions may not contain class or module definitions.
我对这句话的理解是
方法定义不可以包含类或模块定义。
如果按照原译文来理解,显然既然方法定义“可能不”包含类或模块的定义,那当然也“可能”包含了。实际上,只要稍微试一下,Ruby就会告诉你这是不可以的。显然,译者对某些技术细节的把握还稍有欠缺。

喜欢吹毛求疵的我,在看书的同时,给书挑了一些细小的毛病。可喜的是,无论是译者还是编辑都能够对此积极的响应,这样的鼓励使得我有了“变本加厉”的动力。

《Programming Ruby》是一本不错的好书,但是我们不可能指望任何一本书告诉我们世上的所有事情,《Programming
Ruby》也不能,它只是一条通往Ruby世界的桥梁,接下来更多的还是要依靠自己的努力。如果读了这本书发现Ruby还有些吸引自己的地方,那就进入
Ruby的世界享受编程的乐趣吧!
Admin
Admin
Admin

帖子数 : 641
注册日期 : 08-03-25

http://kcjun.longluntan.cn

返回页首 向下

返回页首


 
您在这个论坛的权限:
不能在这个论坛回复主题