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

本地变量:小写字母开始或下划线开始
全局变量:以$开始
实例变量:以一个@开始
类变量:以两个@@开始
常量:用大写字母开头

单行代码可用#注释,而多行代码可以用=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和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种的内建类

=   " abc "  
=  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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值