首页
出自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]
- 抛出一个包含消息的格式为 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, 这确实是它的缺点。但其优点也很明显,即可移植性很高。

