The Ruby Way 第二版 第一章学习笔记

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

我响应你的建议,我也来看这本书吧,我喜欢讨论,这样可以快速掌握。

想你也是很忙了,这不来了,还带来好建议和好文章,谢谢!
支持一下。。。
哇, livahu,你也更新了我的认识,我也以为Ruby没有注释块呢,这下明白了。
呵呵,大家一起学习,毕竟工作中很难用上,只能业余时间好好研究了
觉得=begin还是很有用的