ruby句法问题

发表于:2007-07-04来源:作者:点击数: 标签:
4.1 像:exit这种带:的标识符表示什么? 它叫做符号对象,它与标识符之间是1对1的关系。您也可以使用"exit".intern来得到它。在catch, throw, autoload等方法中,既可以使用字符串参数,又可以使用符号参数。 4.2 如何取得与符号同名的变量的值? 在symbol的作
4.1 像:exit这种带:的标识符表示什么?

它叫做符号对象,它与标识符之间是1对1的关系。您也可以使用"exit".intern来得到它。在catch, throw, autoload等方法中,既可以使用字符串参数,又可以使用符号参数。

4.2 如何取得与符号同名的变量的值?

在symbol的作用域内,使用eval((:symbol).id2name)来取值。

a = 'This is the content of "a"' b = eval(:a.id2name) a.id == b.id 4.3 loop是控制结构吗?

不,它是方法。该块会导入新的局部变量的作用域。

4.4 a +b报错,这是怎么回事儿?

它会被解释成a(+b)。+的两侧要么都有空格,要么就都没有。

4.5 s = "x"; puts s *10 报错,这是怎么回事儿?

puts s *10会被解释成s(*10)的方法调用,所以要么s*10这样,要么s * 10这样。

4.6 为什么p {}没有任何显示呢?

{}会被解释成块,而并非哈希表的构造函数。所以您需要使用p({})或者p Hash.new来解决这个问题。

4.7 明明有pos=()这样的setter方法,可为什么pos=1时却没有任何反应呢?

请看下例。

class C attr_reader :pos def pos=(n) @pos = n * 3 end def set pos = 1 #A行 end end a = C.new a.set p a.pos #=> nil (预期值是 3)

本来指望最后一行能输出 3,但却是个 nil ,这是因为Ruby把A行的pos解释成局部变量了。若想调用pos=()的话,请这样self.pos = 1调用。

4.8 '\1'和'\\1'有什么不同?

没有不同,二者完全一样。在单引号中,只有\'、\\和行尾的\(取消换行)会得到特殊的解释,其他字符不变。

4.9 在p true or true and false中会显示true,但在a=true if true or true and false中却不会把true赋值给a。

第1个表达式会被解释成(p true) or true and false,其中的and/or是构成语句的要素,而并不是用来连接p的参数的操作符。

第2个表达是则会被解释成a=true if (true or true and false)。因为if的优先度低于and/or,且or与and的优先度相同,所以就会从左到右地完成解析。

4.10 为什么p(nil || "")什么事儿都没有,可p(nil or "")却会报错呢?

虽然||可以连接参数,但or就只能连接句子,所以如此。关于这点区别,您试一试下面的例子就明白了。

p nil || "" p nil or ""

原文转自:http://www.ltesting.net