跳到主要内容

Programming Ruby ver.2

· 阅读需 7 分钟
Chengyu HAN
Open Source Contributor

七周七语言里推荐的书,随便看看,记点笔记

幕布版 Programming Ruby —— The Pragmatic Programmer's Guide​

----- 2. Ruby.new ------

Object-Oriented

Ruby是一门面向对象的语言。 你所操作的每件东西都是对象,操作结果本身也是对象。

/class 用来表示实体,类是 状态/state 和使用这些状态的 方法/method 的组合

实例

建立了类,需要为每个类创建若干实例。 实例/instance == 类的实体/class instance == 对象/object

构造函数

ruby通过调用 构造函数/constructor 来创建对象,标准的构造函数被称为 new.

song1 = Song.new("Ruby Tuesday")
song2 = Song.new("Enveloped in Python")
## and so on

以上的实例都是从相同的类派生出来的,他们具有各异的特征:

  • 每个对象有 唯一的对象标识符/object identifier/Obj ID
  • 可定义 实例变量/instance variable
    • 变量的值对每个实例来说是唯一的
    • 每个实例都持有对象的 状态/state

实例方法

可以为每个类定义 实例方法/instance method. 每个方法都是一组功能,他们可能在类的内部or外部被调用,实例方法用来访问对象的实例变量及其状态。

消息

方法用过向对象发送 消息/message 来唤起调用。 消息包含方法名称以及方法可能需要的参数。当对象接收到一条消息是,他会在自己的类中查找相应的方法:

  • 找到了方法会被执行
  • 没找到....

接收器

irb(main):001:0> "gin joint".length
=> 9
irb(main):002:0> "Rick".index("c")
=> 2
irb(main):003:0> -1942.abs
=> 1942

以上代码中. 之前的东西称为 接收者/receiver,之后是被调用的方法。 在其他语言中 Ex: Java 你需要另一个函数来处理绝对值,并回传结果。而Ruby中 绝对值方法內建在number类中,只需发送一个abs消息给 number 就能得到绝对值。

所以我们说——Ruby是一门真正的面向对象的语言。


Some Basic

Ruby 的语法很干净:

  • 不需要语句结束的分号
  • 注释由#开始,行尾结束
  • 缩进排版不重要
  • 不必声明变量

方法

方法/methoddef关键字定义,后接方法名和括号中的参数,用end结束方法。 (实际上,定义中的括号是可选的)

def say_goodnight(name)
result = "Good night, " + name
return result
end
## time for bed...
puts say_goodnight("John-Boy")
puts say_goodnight("Marry-Ellen")

=> Good night, John-Boy
=> Good night, Marry-Ellen

puts 方法输出一行+回车

字面量

字面量/literals,及一组单引号或双引号之间的字符序列:

  • Ruby对单引号处理的较少
  • 对双引号处理的较多
    • 处理转义序列 :\n
    • 处理 内插表达式/expression interpolation#{表达式}
    • 如果表达式是一个 全局实例or类变量,则不需要大括号

内插表达式

def say_goodnight(name)
result = "Good night, #{name}"
return result
end
puts say_goodnight("Pa")

=> Good night, Pa

可以把任意的复杂表达式放在#{...}结构中。 一下代码调用了字符串的capitalize方法,把首字母转为大写

def say_goodnight(name)
result = "Good night, #{name.capitalize}"
return result
end
puts say_goodnight("uncle")

=> Good night, Uncle

--- 5. Stand Types -----

Ruby 中的基本类型: 数字/number字符串/string区间/range正则表达式/regular expression

Numbers

Ruby 支持整数和浮点数。

整数可以是任何的长度,其最大值取决于系统的最大可用内存。

一定范围内的整数 [2030-20^30 ~ 2030120^30-1 or 2062-20^62 ~ 26212^62-1] 是 Fixnum 类的对象,而这个范围之外的整数储存在 Bignum 类中。

进制的表示

一些可选的 前导符

  • 0 表示八进制
  • 0d 表示十进制[默认]
  • 0x 表示十六进制
  • 0b 表示二进制

一些字符的整数值

  • 控制字符 ?\C-x
    Ctrl+x
  • 元字符 ?\M-x
    Alt+x
  • 元字符和控制字符的组合 ?\M-\C-x
    Ctrl+Alt+x
  • 反斜杠 ?\\

小数与幂

带小数点的数字和幂的字面量被转换为浮点对象。 Ex: 1.0e3 not ~~1.e3~~ <- Ruby会调用 Fixnum 类的 e3方法

所有数字都是对象,并且可以相应各种消息。

整数的迭代器

3.times {print "x "}                #=>x x x => 3
1.upto(5) {|i| print i, " "} #=>1 2 3 4 5 => 1
99.downto(95) {|i| print i, " "} #=>99 98 97 96 95 => 99
50.step(80, 5){|i| print i, " "} #=>50 55 60 65 70 75 80 => 50

包含数字的字符串不能隐式转换为数字。

Ex: A+B Program

3 4
5 6
7 8

直接相加不行

ARGF.each do |line|
v1, v2 = line.split # split line on space
print v1 + v2, " "
end

##=>34 56 78

要将字符转化为整数。可用 str.to_iInteger(str) 方法

ARGF.each do |line|
v1, v2 = line.split # split line on space
print v1.to_i + v2.to_i, " "
end

##=>7 11 15

String


--- 15. Ruby shell -----

Tab Completion

ref:

ri in irb

~/.irbrc中添加

def ri(*names)  
system(%{ri.bat #{names.map{ |name| name.to_s}.join(" ")}})
end

可以实现在irb中直接调用ri

ri & rdoc

为了愉快的使用ri首先要生成rdoc

gem rdoc --all --ri --no-rdoc

然而只生成了部分文档,还得再找找方法

Getting Ruby documentation from command line? [duplicate]

看来需要更新/下载rdoc,执行gem install rdoc-datardoc-data --install

I:\Ruby>gem install rdoc-data
Fetching: rdoc-data-4.1.0.gem (100%)
rdoc-data is only required for C ruby 1.8.7 or 1.9.1.

rdoc-data is required for JRuby.

To install ri data for RDoc 4.0+ run:

rdoc-data --install

Successfully installed rdoc-data-4.1.0
Parsing documentation for rdoc-data-4.1.0
Installing ri documentation for rdoc-data-4.1.0
Done installing documentation for rdoc-data after 0 seconds

测试 ri Stringri Proc

I:\Ruby>ri String
String < Object

------------------------------------------------------------------------------
Includes:
Comparable (from ruby core)

(from ruby core)


.... many lines ....


I:\Ruby>ri Proc
Proc < Object

(from ruby core)
------------------------------------------------------------------------------
Proc objects are blocks of code that have been bound to a set of local
variables. Once bound, the code may be called in different contexts and still
access those variables.

gen server' bug

在检查文档状态时发现了个小bug

I:\Ruby>gem server
Server started at http://[::]:8808
Server started at http://0.0.0.0:8808

事实上应该是 http://localhost:8808

搜了一下是已存在的bug gem server seems to not REALLY be doing what it says the defaults are