关于代码

  • 单行注释使用#开头,和 python 类似
  • 多行注释使用=begin 开始, =end 结束,需要注意的是 =begin 和 =end 必须顶格写(行首),不能有空白符
  • 分号; 表示一个语句的结束,一行如果有多个语句每个语句用分号隔开,最后一个语句可以省略分号,和 python 类似
  • 行连接符使用’'结尾,和 python 类似

关于标识名

  • 标识名区分大小写
  • 局部变量、方法参数、方法名称应该使用一个小写字母或者_开头
  • 全局变量用美元符号$开头
  • 实例变量(对象变量)应该使用@开头
  • 类变量(静态变量)应该使用@@开头
  • 类名称、模块名称、常量应该使用大写字母开头

关于数据类型

  • 数据类型有:数字、字符串、数组、哈希表、区间,正则表达式(类型 python 中 int/double、str、list、dict、range、regex)
  • 数字有整数型和浮点型
  • 字符串在’'(单引号)、""(双引号)之间的代码
  • 数组类似 python 中 list,应该可以存放不同类型的元素
  • 区间用..或者…表示,前者包括左右边界,后者仅包括左边界
  • 除了 false 和 nil 当作 false 以外,其它任何对象都当作 true,这和 python 很不一样

赋值

同 Python 一样,动态类型不用预先定义类型,运行时自动检测类型。例如:

a=1;
a,b=b,a
a,b,c=1,3,5
没有++,-- 运算符,可以用+=或者-=

条件运算符

条件运算符比较复杂,有一些比较特别的运算符。

==    比较两个对象的值是否相等,例如,a=1;b=1.0; (a==b) == true
!=    比较两个对象的值是否相等,例如,a=1;b=1.0; (a!=b) == false
eql?  比较两个对象的值和类型是否相等,例如,上述 a.eal?(b) == false
equal?    比较两个对象的内存地址是否相同,和java的默认Object比较类型
<=>   比较两个对象的大小,分别返回 1,0,-1,类似java的Comparable接口
=~    用来比较字符串是否符合一个正则表达式,返回模式在字符串中匹配的位置,无匹配返回nil
!~    断言字符串不符合一个正则表达式,返回true,false

条件判断语句

  • 单行 if 语句

单行 if 语句有两种语法

1. if condition then statement1;statement2;... end
2. (statement1;statement2;...) if condition

这和 python 非常类似:

1. if condition: statement1;statment2
2. (statement1;statement2...) if condition else (statementN)
  • 多行 if 语句

这个 elsif 真变态,既不是 elseif,也不是 elif。看来是为了阻止别人说他抄袭!

if condition
    statement1;...
elsif condition2
    statementB;...
else
    statementX
end
  • unless 语句

unless 语句有点特别:

unless condition
    statement1;...

意思是,除非 condition==true,否则执行 statement1 语句,等价于

if ! condition
    statement1;...
  • case 分支条件语句

case 语句相当于 java 中的 switch/case 语句:

case    Object
when    condition1
    statement;...
when    condition2
    statement;...
else
    statement;...
end

循环语句

  • while 循环

while 语句同样分为单行和多行语句,个人觉得之所以这样设计是为了避免非要写 end 结构。

( statement1; statemen2; ...) while condition

while condition
    statement1; statement2; ...
end
  • until 循环

类似于 while 循环,只不过条件相反,也就是如果条件为 true 则终止循环。

( statement1; statement2; ...) until condition

until condition
    statement1; statement2; ...
end
  • for…in 循环

主流的语言都支持 for…in 循环,ruby 也不例外。

for x in Object
    statement1; statement2; ...
end

其中 Object 可以是数组、区间、集合等等

  • 循环控制标识

不同于 java/python 等语言,ruby 新增几个循环控制语句。

break   跳出循环,和java/python类似
next    继续循环,类似于java/python中的continue
redo    重新开始循环,从这一次开始
retry   重新开始这个循环体,从循环的第一次遍历开始
  • times, upto, downto, each, step

TODO

异常

对应于 Java 中的 try…catch…finally…throw,ruby 中的异常语句为

begin/end...rescue...ensure...raise

python 的异常语句为

try...catch...else...finally

类与对象

简单的对象封装

class User

    def initialize(id,name,group="guest")
        @id = id
        @name = name
        @group = group

    end

    def whoami
        puts "id="+@id.to_s+", name="+@name+", group="+@group
        if @group == "root"
            puts "I am super user"
        end
    end

    attr_writer :group, :name
    attr_reader :name
    attr_accessor :id
end

使用方法

root = User.new(1,'root')
root.group = 'root'
root.whoami

guest = User.new(0,'guest')
guest.id = 602
guest.group = 'guest'
guest.whoami
puts guest.id

对象的定义和使用有点类似 python,但也有一些差别

  • 类、方法都需要 end 结尾,这个有点烦人
  • 初始化方法为 initialize,类似于 java 中的构造函数、python 中的init方法
  • 类属性用@前缀命名
  • attr_writer 是 setter 方法,类似的 getter 方法为 attr_reader,以及同时读写方法 attr_accessor

简单的类继承

class Guest < User
end

guest = Guest.new(0,'guest')
guest.id = 602
guest.group = 'guest'
guest.whoami

继承后自动拥有父类的构造函数。