The Ruby Way 第二版 第一章学习笔记
最近项目实在太忙,这不昨天才有时间看了下the ruby way 2nd这本好书,建议坛子里的朋友都看看,你会明白很多以前忽略的东西,作为记忆和分享,我把一些重要和有用的东西写出来,希望有用(当然你可以看成是水贴)。我有时间就会一直读下去,把每章的知识点都写出来,当然还有一个好提议,我们可以成立一个read <the ruy way 2nd>的读书会。好似恰同学少年中的那样,很有意思
本地变量:小写字母开始或下划线开始
全局变量:以$开始
实例变量:以一个@开始
类变量:以两个@@开始
常量:用大写字母开头
单行代码可用#注释,而多行代码可以用=begin =end代码块注释(本来还以为ruby没有块注释)
=begin
The purpose of this program
is to cure cancer
and instigate world peace.
=end
在ruby中,变量是没有类型的,但他所引用的object是有类型的。
“”在ruby中是会对其中的字符做解释的,而‘’则不会。
有用的是用重音符 ` 包围的字符会被用做操作系统的命令执行,所以puts `dir`会显示当前的目录环境
更复杂的命令组合你可以用%x[your commands]
普通的数组是这样[”livahu”, “com”, “http”, “www”, 1, 4, [”4ggg”, 33]]
但由于数组使用得太平凡了,所以ruby就做了一个好事可以这样
%w[alpha beta gamma delta]
%w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
%w/am is are was were be being been/
不过如果你的数组元素本身有空格,那就would not work well了(如果你有solution,可以send me email:livahu@gmail.com或在这里留言)
关于hash,一个hash就是一个Hash类的实例,对于key和value的类型没有作保
在ruby中,方法调用可以忽略(),像gets,print这样的方法,它们明显独立不会和别的方法混淆,一般是来自Object类的
在ruby中,一个方法打!号代表会更改receiver本身的值,而不是仅仅返回一个值
在ruby中做boolean转型时,”"和0会被看计算成true,只有nil和false才会认为是false
在ruby中case是很强大的,比其它语言的switch要强大
case "This is a character string."
when "some value"
puts "Branch 1"
when "some other value"
puts "Branch 2"
when /char/
puts "Branch 3"
when 5..9
puts "Branch 4"
else
puts "Branch 5"
end
你可以使用regex和php?name=range" onclick="tagshow(event)" class="t_tag">range
在ruby中,loop是相当灵活的,retry只能在begin/end代码块和for循环中使用,redo只能在while和until循环中使用
raise用来抛出异常
begin
x = Math.sqrt(y/z)
# ...
rescue ArgumentError
puts "Error taking square root."
rescue ZeroDivisionError
puts "Attempted division by zero."
end
在begin/end代码块中来处理这些异常
begin
x = Math.sqrt(y/z)
# ...
rescue => err
puts err
end
还有上面这种形式,可以用来捕获自己不知道的异常
和java中的finally一样,ruby中有ensure来确保会在begin/end代码块exit之前执行ensure中的代码
在ruby当中,每一切皆对象,而每一个对象又是一个具体类的实例,这些类实现了一些方法供使用
和java一样,ruby不允许多继承,它有超过30种的内建类
y = "abc"
x = y
x # "abc"
x.object_id # 53732208
y.object_id # 53732208
但如果用方法更改了x,x.gsub!(/a/,”x”),那y也会变为xbc
不过重新赋值则会让x = “abc” x #abc,不会影响y y#xbc
可以通过freeze方法来使一个可变的对象不可变
x.freeze
x.gsub!(/b/,"y") # Error!
符号在ruby中是很有意思的一个东西,它引用一个变量通过名字而不是引用(在许多情况下,使用ruby的symbol更加有效率)
符号可以通过to_s方法转换成为string
Ruby的Modules和Mixins
模型就是一堆扩展方法和常量的集合
Mixins是用include引入模型后的结果
include引入的只能做为实例方法,不能做为类方法
而extend引入的可以做为类方法
load方法是装载并执行相应文件,require是如果没有load就load,如果load了,就不会再load了
其实ruby中自己建立的类,严格来说没有自己的名字,因为Class YourClassName相当于 String str,我们所建立的类名,其实也只是类Class的一个实例,Class是ruby的一个内建类
Module类里有attr,attr_accessor,attr_reader和attr_writer方法用来改变实例变量的可见性
实例变量总是private的
默认method是public的
可以像这样来改变它们的访问性
class MyClass
def method1
# ...
end
def method2
# ...
end
def method3
# ...
end
private :method1
public :method2
protected :method3
private
def my_method
# ...
end
def another_method
# ...
end
end
class MyClass < OtherClass
# ...
end
这样便实现了类的继承
alias newname oldname
可以用来把一个老方法名取一人新方法名,之后,两个名字都可以用。注意alias不是method而是关键字,有一个方法和它类似alias_method
由于ruby中每个表达式都返回最后的值,所以method的调用可以chain
像这样/(x.z).*?(x.z).*?/.match(”x1z_1a3_x2z_1b3_”).to_a[1..3]
但要注意,如果返回的类型没有对应的方法就会出错了(比如nil)
还有一件有意思的事是ruby可以定义某个实例的方法,而不是类的
str = "Hello, world!"
str2 = "Goodbye!"
def str.spell
self.split(/./).join("-")
end
str.spell # "H-e-l-l-o-,- -w-o-r-l-d-!"
str2.spell # error!
ruby中没有编译时间,所以如果程序员要对不同平台执行不同操作的话,可以这么做
if platform == Windows
action1
elsif platform == Linux
action2
else
default_action
end
但这样做
if platform == Windows
def my_action
action1
end
elsif platform == Linux
def my_action
action2
end
else
def my_action
default_action
end
end
执行my_action方法时,就不用每次都判断了
ruby的代码块不是一个对象,但有一个Proc对象可以使代码块对象化,但控制结构是做不到的
关键字defined? 可以判断一个变量是否被定义
is_a?(kind_of?)可以判断一个对象是不是一个类(或超类)的实例
你也可以通过methods来能得到ruby Object类中的方法
Module类有一个constants方法可以返回一个模型的常量列表
Module类的ancestors方法将返回一个模型本身所包含的模型,当然首先包含自己
Object类有一个superclass返回一个对象的超类,如果没有就返回nil
更友好的加亮模式在我的博客http://www.livahu.com/?p=53