4. 句法

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,且orand的优先度相同,所以就会从左到右地完成解析。

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

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

p nil || ""
p nil or ""