首页

出自Ruby中文维基

跳转到: 导航, 搜索

目录

[编辑] Ruby非官方中文Wiki

欢迎光临Ruby中文Wiki

一起来完成Ruby文档的中文化吧。。。

Ruby中文Wiki 是一个为 Ruby 编写文档的Wiki站点。它属于非盈利性的,我们在这里创作、改进、收集和整理 Ruby 的中文文档。我们欢迎任何人参与到文档编写工作中来,请在文档中标明所支持的版本。

Ruby,一种为简单快捷面向对象程序设计而创的脚本语言,由日本人Yukihiro Matsumoto(外号matz)开发,遵守GPL协议和Ruby License。Ruby的作者认为“Ruby > (Smalltalk + Perl)/2”,表示Ruby是一个语法像Smalltalk一样完全面向对象、脚本执行、又有Perl强大的文字处理功能的程序语言。其他特色包括:

   * 运算符重载
   * 自动垃圾回收
   * 在Windows上,载入DLL
   * 巨大的标准库

[编辑] 历史

Ruby的作者于1993年2月24日开始编写Ruby,直至1995年才正式公开发布。Ruby明显比其他类似的程序语言(如Perl或Python)年幼,又因为Ruby是日本人发明的,所以早期的非日文资料和程序都比较贫乏,所以现在在网上仍然可以找到Ruby的资料太少之类的批评。约于2000年,Ruby开始进入美国,英文的资料开始发展。

Ruby现在的稳定版本是1.8.6。

[编辑] Ruby的Hello World程序

下面是一个在标准输出设备上输出Hello World的简单程序,这种程序通常作为开始学习编程语言时的第一个程序:

#!/usr/bin/ruby 
print "Hello, world!\n"

[编辑] 外部链结

   * Ruby官方网站
   * RubyForge
   * Ruby Documentation project
   * Ruby 非官方中文论坛

[编辑] Ruby编程基础

[编辑] 数字类型

Ruby 支持整型和浮点型两种数字类型。
整型可以是任意长度(最大值由你机器的内存大小决定)。在一定范围内(通常是

-2^30 to 2^30-1 or -2^62 to 2^62-1)在内部由二进制方式表示,内部类为 Fixnum。大小超过这个范围的整数由Bignum表示,如果Fixnum计算之后结果超出 范围,自动转换为Bignum。Ruby在两者之间自动转换,对用户来说是透明的。

irb> f1=1.0
irb> p f1.class 
  Float
irb> i1=1
irb> p i1.class
  Fixnum
你也可以在使用整型的时候在前面使用进制标示符,比如0表示八进制,0x表示十六进制,

0b表示二进制等。而且,如果一个整型数字中有一个下划线,这个下划线将被忽略。

123456                    # Fixnum
123_456                   # Fixnum (underscore ignored)
-543                      # Negative Fixnum
123_456_789_123_345_789   # Bignum
0xaabb                    # Hexadecimal
0377                      # Octal
-0b101_010                # Binary (negated)
通过 irb>help Numeric / Integer / Float 等进行查询帮助。
也可以得到一个ASCII字符或者一个转意字符的数字值通过在它前面加一个问号。

Control和Meta键的组合也可以用?\C-x, ?\M-x 和 ?\M-\C-x表达。 字符value的加Control键的版本和"value & 0x9f"的值是一样的;字符value 的加Meta键的版本和"value & 0x80"的值是一样的。最后,序列 ?\C-? 产生 一个ASCII码的删除,0177。

irb> p ?\C-x
  24
所有数字都是对象,有自己的属性、方法,比如 
irb>p 3.class
  Fixnum
整数也支持一些有用的迭代器(iterators)。比如7.times do,还有其他的

比如 upto 和 downto,用来在两个整数之间向上和向下迭代,还有 step, 用于传统的 for 循环语句。

irb>3.times do
irb> print "hi"
irb>end
  hihihi
还有一些例子自己试试:
1.upto(5)      { |i| print i, " " }
99.downto(95)  { |i| print i, " " }
50.step(80, 5) { |i| print i, " " }

[编辑] 字符串

Ruby的字符串是简单的8位字节(8-bit bytes)序列。它们通常保存可打印字符序列,

但是这不是必须的;一个字符串也可以保存二进制数据。字符串是String类的对象。

用双引号刮住的字符串支持更多的转义字符。最常见的转义字符可能是"\n"了,

代表一个换行符。另外,你可以用 #{ expr } 来把任何的Ruby表达式的值插入 到字符串中。如果那个表达式是全局变量,类变量或者实例变量,你可以省略大括号。

irb>print "每天有#{24*60*60}秒" 
 每天有86400秒
irb>print "#{'go'*3}"
  gogogo
还有三种方法来构建字符串常量:%q, %Q和“here documents.” 
跟在'q'或者'Q'后面的字符是分隔符,如果那个字符是括号,大括号,圆括号或者小于

等于符号,那么程序会一直向下读直到遇见最近的停止符号,或者到匹配到相应的符号才 停止,然后把读入的字符作为一个字符串整体。

irb>a=%Q!this is a test for %Q ! 
irb>p a
  this is a test for %Q 
用"here document"构建字符串。<<END_OF 表示结束用END_OF标识。
irb>aString = <<END_OF
irb>The body of the string
irb>is this
irb>END_OF
irb>print aString
  The body of the string
  is this
如果用<<-END_OF来表示结束,就会忽略掉END_OF前面的缩进,否则前面有缩进的END_OF

不会被算为结束符号。

[编辑] 文件

文件的读写模式如下: r 只读模式(默认)。 r+ 读写模式,从头开始。 w 写模式,如果存在会被覆盖。 w+ 读写模式,如果存在会被覆盖。 a 追加写模式,如果没有就创建。 a+ 读写模式,从文件尾开始。没有会被创建。 b 二进制模式。

irb>begin
irb>aFile = File.new("c:\\test.txt", "r")
irb>aFile.each_byte {|ch| putc ch}
irb>aFile.close
irb>end

上面each_byte...更改为

each_line{|ch| puts ch}

也可以, 最简单的是用IO迭代器。

IO.foreach("c:\\test.txt") { |line| puts line }

也可以用数组的方式。

arr = IO.readlines("c:\\test.txt")  
0.upto(arr.length){|i| puts arr[i]}

写文件:

f = File.new("c:\\out.txt", "w")
f.syswrite("ABCDEF")
f.close

[编辑] 正则表达式

[编辑] 数组

[编辑] 迭代器

[编辑] 语句

[编辑]

class

[编辑] 异常

异常处理是开发过程中经常要面对的问题,基本所有高级语言都有自己的异常处理系统,ruby也不例外,而且使用起来也非常简单。

ruby中异常的抛出是使用的raise方法,记住哦,这是个方法,由ruby Kernel提供的,而不是关键字,同时ruby也为这个方法提供了一个别名fail,可以用fail代替raise,抛出异常的例子如下:

 raise                                  #抛出一个默认的RuntimeError
 raise "Some error message"             #抛出一个消息为"Some error message"的RuntimeError
 raise ArgumentError                    #抛出一个无消息的ArgumentError
 raise ArgumentError, "Bad data"        #抛出一个消息为"Bad data"的ArgumentError
 raise ArgumentError.new("Bad data")    #同上
 raise ArgumentError ArgumentError, "Bad data", caller[0]  
  1. 抛出一个包含消息的格式为 lename:line 或者filename:line:in 'method' 的异常

以上代码中的raise可以使用别名fail代替,在没有明确的给出异常类型时,ruby默认抛出RuntimeError,其中最后 一个例子抛出的信息包含了当前错误所在的文件,行数已经所在的方法的信息,这些信息都存储在caller这个数组中,里面包含了方法调用者的相关信息,第一个元素包含了方法的调用者的信息,第二个信息包含了方法调用者的调用者的信息,以此类推。这个数组在我们想知道异常是在哪个地方的哪个调用被抛出的时候非常有用的。


 def func1
   puts caller            #打印调用者信息
 end
 
 def func2
   func1                    #第六行
 end
   
 def func3
   func2                    #第十行
 end
 
 func3                    #最终调用者,十三行
 
 #运行结果
 #test.rb:6:in `func2'
 #test.rb:10:in `func3'
 #test.rb:13

从上面的代码可以看出,caller记录了每个调用者所在的文件名,行数以及方法。

上面讲解了关于ruby异常抛出的方式以及caller数组的作用,接下来我们来了解一下ruby中是如何进行异常的捕捉的,在java中,异常的捕捉是在try ... catch当中进行,而ruby则是在begin ... end代码块中进行异常的捕捉,在该代码块中使用rescue关键字进行捕捉异常类型,注意哦,这个是关键字,而不是方法。

 begin
   ......                               #可能出现异常的代码
 rescue  errorType1            #要捕捉的异常类型
   ......                               #处理异常的代码
 rescue  errorType2            #要捕捉的异常类型
   ......                               #处理异常的代码
 end

以上代码就是一个大概的捕捉异常的例子,在begin和end代码块中通过rescue进行异常类型的捕捉然后进行适当的处理,可是如果抛出的异常类型并没有显示的捕捉如何处理呢?那就是在最后使用else,如下:

 begin
   ......                               #可能出现异常的代码
 rescue  errorType1            #要捕捉的异常类型
   ......                               #处理异常的代码
 rescue  errorType2            #要捕捉的异常类型
   ......                               #处理异常的代码
 else
   ......                               #如果以上代码类型都没有捕捉到,则运行该段代码
 end

这时又有一个问题,如果我想获取异常信息又该如何做呢?请看下面的代码:

 begin
  raise ArgumentError, "Bad data"
 rescue => err
  puts err
 end

通过rescue => variable的方式,就可以将异常保存为一个variable了。又解决了一个问题,还有什么问题呢?啊,对了,在java的使用当中,比如使用 Connection进行数据库连接后,最后一定要进行资源的清理,都是在finally块当中进行的,可是在ruby中又如何进行这些资源的清理呢?看看下面的代码:

 begin
  raise ArgumentError, "Bad data"
 rescue => err
  puts err
 ensure
  ...                       #执行清理工作
 end

从上面代码我们看到,ruby提供了一个关键字ensure,它的作用和java中的finally一样,无论任何异常,该关键字下的代码都必然会在退出代码块前执行。同时,ruby还提供恢复功能,如果在抛出异常并进行异常处理后我们需要进行恢复工作,那就是使用retry就会重新执行代码块了。

上面提到,异常的捕捉处理必须在begin-end代码块中进行,那是不是无论什么时候都要书写begin-end这两个关键字呢?其实也不是,在 ruby中,方法实际上就是一个隐式的begin-end代码块,所以在方法中进行异常的捕捉和处理,可以省略begin。

[编辑] 线程

Ruby中使用的线程是用户级线程,由Ruby解释器进行切换管理。其效率要低于由OS管理线程的效率,且不能使用多个CPU,
这确实是它的缺点。但其优点也很明显,即可移植性很高。

[编辑] 模块

[编辑] 常用扩展模块

个人工具