1.9.x 版使用新的解释器 YARV, 1.8.x 速度快; 比 重写了 String 类,增加了 Encoding 类,从此可以完善处理多字节字符;杀手应用 RoR 也一 早支持了 1.9.x 版;还有一些语法上的改进。 本问答以 1.9 版语法为准,两个版本有一些语法差别,略提几条区别的线索: § 如果有 require 'rubygems'的,为 1.8 版; § 如果看见$KCODE 的,为 1.8 版; § 哈希的键值对之间可以用逗号(而非=>)分隔的,为 1.8 版; § if condition:这种和 Python 一样的写法(条件之后用冒号) ,为 1.8 版 § {|a,b;x,y| }的写法(用分号隔开两类参数) ,一定是 1.9 版 Q:有些写法感觉很奇怪,比如 5.times { puts "Ruby! " },怎么理解? 这种写法其实很酷。Ruby 中一切值都是对象,包括整数。Integer 类有实例方法 times,依次 传递 0 到 n-1 给后面的代码块,相当于运行 n 次后接的代码块。 这一代码就是在 5 上调用方法 times Q:Ruby 代码中很少看见 for...in/foreach 的写法,为什么? 相比 for i in xx 的循环方式, Ruby 的风格是更喜欢用 xx.each {|i| }这种调用迭代器方法的方 式。 对于数组 for elem in array,迭代器方法写作 array.each { |elem| }
对于读文件的每行 for line in file,迭代器方法写作 file.each { |line|
}
相比 for...in 方式,迭代器方法更快,更灵活,更强大,比如对于一个 file 对象 file.each_line { |line| } # 每次处理一行 file.each(' ') { |para| } # 每次处理一段 file.each_char { |char| } # 每次处理一个字符 file.each_byte { |byte| } # 每次处理一个字节 file.each_line.with_index(1) { |line, lineno| } # 传递行时,还把索引值(在这里就是行号)也传递给代码块 这些都不是 for...in 擅长的 至于 for(i=0; i<10; i++)这种写法
,Ruby 当然是写成 9.times {|i| }这种形式了 Q:Benchmark::measure、Benchmark.measure 两种写法有什么区别?
表示方法调用,用::还是用.,完全是一样的,指向的是同一个方法,区别只在于作者怎么看 待 measure 这个方法。 符号::一般是用来分隔嵌套的模块、 常量的, 类、 写成 Benchmark::measure, 像是表明 measure 是 在 Benchmark 这 个 模 块 中 定 义 的 函 数 , Benchmark 只 是 它 的 容 器 ; 而 写 成 Benchmark.measure,像是在说 measure 是对 Benchmark 这个对象进行操作。
从内部实现上说,Ruby 中只有方法,没有函数;但从内涵上说,Benchmark::measure 的意 义更确切,所以有人愿意这样写。 Q:Array#each 是什么意思? Array#each 的写法并不用在实际代码中,而是
文档中约定俗成的一种写法,表示 Array 类中 定义的实例方法: array = Array.new array.each {} # Array#each 指的就是这里的 each,是 Array 类的实例所用 Q:::Foobar 是什么意思? 其中的::是分隔嵌套模块、类、一般常量的分隔符,::前面没有东西,表示到 global scope 去 找这个常量。 Q:经常听到 Ruby“一切皆对象”的说法,怎么理解? 严格来说, 应该是 Ruby 中一切可独立的合法语言片段都是表达式, 表达式都要返回一个值, 而一切值在 Ruby 中都是对象。
比如 true false nil 也是对象,分别是 TrueClass、FalseClass、NilClass 的实例 比如 if 结构可独立,所以是表达式,所以要返回值,这个值总是一个对象,所以 if 结构可 以赋值给一个变量: a = if x > y x+4 else y*2 end 比如模块、类也是对象,String、Array 等类是 Class 类的实例对象,Class 作为对象也是 Class 这个类的实例
Q:$foo、@bar 和@@baz 里的$、@、@@是什么意思? Ruby 没有 global、local 之类关键词设定变量可见范围,而是采用变量自带标记的方式
§ 以小写字母或_开头的变量是局部变量
§ 以$开头的是全局变量
§ 以@开头的是每个对象自身的实例变量
§ 以@@开头的是同类对象都可访问的类变量 Q:大写字母开头的名称代表什么? 大写字母开头的是常量,包括模块名、类名都以