Ruby 学习笔记

* 在Ruby中,类从来不关闭,意味着,总是可以在一个现在类上添加或重定义方法。写法就是写上这个类名,然后直接写方法。

* 变量,实例变量,类变量,甚至还有“常量”其实都只是对象引用。它们引用对象,但不是对象本身。因此,可以被动态地改变,甚至引用另一种不同类型的对象。

* Ruby必须进行一些约定以帮助每个人知道某个变量正为代码所使用。下面是一些命名约定:

  • 局部变量和方法以一个小写字母开头
  • 方法名字以一个小写字母开头
  • 全局变量以一个$开头
  • 实例变量以一个@开头。就是一个对象中的变量。Java中叫“属性”
  • 类变量以两个@开头。应该就是对应Java中的Static属性。
  • 常数以一个大写字母开头,但经常被指定全部大写
  • 类和模块以一个大写字母开头

* 可变参数的方法:def initialize(s1 , s2 , s3 , *others)

* 给参数设置默认值:def initialize(hgt = 1 , wdth = 1)

$ 类变量和类方法

* 创建一个新的实例对象方法:BankAccount.new(),其实就是一个类方法。在写类方法的时候,要在文件中把类名写上。

* 继承:class Square < Rectangle 。当编写应用程序时,可以在类定义外定义方法。

$ 方法存取控制

 * 有private , protected , public 三个可以控制。Public是所有方法的默认设置。

 * 所有从Private关键字开始定义的方法都是私有的,直到代码中出现另一个存取控制关键字为止。

 * 默认情况下,在Ruby中,实例和类变量都是私有的,除非提供了属性accessor和mutator(def name=)

$ 多继承

 * Ruby支持单继承,但也提供了mixin,也就是多继承的特征。(这点和Scala一样),一个mixin是一种“模块”类型。

 * 模块是一种把方法和常数分组的方式。与类相似,但模块没有实例且没有子类。

 * 模块的优点在于,在存取其中的公式时,没有任何实例扰乱所带来的烦恼

 * 定义的时候用module 来取代class

 * 调用:必须使用类似于调用一个类方法的标志。调用一个模块方法:[模块类名.方法名],调用一个模块常数:[模块名::常数名]

 * 使用模块:要在某个类中使用include [模块名] 来mixin这个模块。这样这个类的实例就有了模块中的定义的常量和方法

$ 控制流

 * 控制流命令:包括条件(if/else),case语句和循环语句(do , while , for),还有像java中的异常处理能力

 * 异常处理:把Java中的"try ... catch ... finally"更改为"begin ... rescue ... ensure"语句

 * 抛出异常,则使用raise方法。可以带一个String的参数,来显示异常信息。

$ 数字,字符串和其它

 * 字符串中,单引号里的内容可以直接显示出来,而“”中的内容,如果有\,则会转译

 *  可以直接在字符串里使用表达式,语法如下:

"try to add #{2 + 2}"

则显示出来的会是 try to add 4

 * Ruby中没有char类型,char就是一个小的字符串

$ 正则

 * 可以用匹配操作符("=~")来匹配或查找其它的字符串: if golfer =~ /Tiger|Phil/ ...

 * 正则的写法: /.../

$ 范围(range)

 * 一个范围是一个值序列。

 * 有一个操作符:<=>,拿左边的操作数与右边的操作数进行比较,小于,等于,大于所返回的值是-1,0,1,如A<=>B 返回-1。运行于整数4上的succ方法(4.succ)会返回5

 * 可以使用Range类的new方法或".."来表示一个范围。

 * 默认的范围是包括最后一个元素。若要不包括最后一个,则可以在new的时候使用Range.new("A","Z",true)或者("A"..."Z")来除去最后一个元素。

 * 范围可以作为生成器(generator),如kilobytes = (1..10),然后在范围上的每个方法允许遍历该范围中的每个元素。

 

$ 数据结构:

 * 数组:用[] 和 ,隔开的单个对象。如:presidents=["john","richard","george"]

 * 可以使用一个特殊的标志来消除双引号的逗号:如下:

presidents= %w[ John Richard Gerald Ronald George William]

 * 注意:在Ruby中,一个“数组”可以是由不同性质的对象引用组成的集合。使用及访问方法如下:

order_date=Date.today()
shirt_information=[14.5,"Long",32,order_date]

irb(main):003:0> shirt_information[2]
=> 32
irb(main):004:0> shirt_information.at(2)
=> 32

还可以使用负数索引来引用数组中的元素。表示从尾部开始计数的。

  * 数组还可以进行+-×的运算。

  * 数组还可以有类似于HashMap的作用,如可以写成:

holidays={"New Year" => Date.parse("2006-01-02") , "MLB" => Date.parse("2006-01-16")}

"New Year" => Date.parse(...)的形式就是一种K-V对。

 

$ 代码块,迭代子和过程对象

 * 一个代码块也是一个对象。跟Java中的匿名函数,内部类和回调函数概念差不多。

 *  Ruby代码块的语法是:把Ruby代码放在{}之间或放在do/end命令之间。

 * 使用这些代码块并把它们作为一组代码传递给一个方法:首先要定义一个如下形式的简单方法:

def someMethod
  yield
end

其中,“yield”把控制传递给代码块,代码块被应用到这个方法中:

someMethod {puts "hello world"}

这种方法一般跟迭代子(iterator)一起使用。比如对于一个数组,可以使用:barnYard.each{|animal| animal.talk}

其中,|符号用于定义要接收的对象引用。迭代子和代码块甚至允许我们完成一些简单的事:

irb(main):001:0> 3.times {puts "Ruby is cool!"}
Ruby is cool!
Ruby is cool!
Ruby is cool!

Integer类也提供了一个迭代子(times方法)。

 * 代码块可以被赋值给一个变量。这样的代码块实际上是Proc类的实例。(至于怎么用,没看懂)

 

 

 

 

 

 

 

 

 

 

 

posted @ 2012-05-03 10:08  peterZ.D  阅读(1133)  评论(0编辑  收藏  举报