:exit这种带:的标识符表示什么?
loop是控制结构吗?
a +b报错,这是怎么回事儿?
s = "x"; puts s *10 报错,这是怎么回事儿?
p {}没有任何显示呢?
'\1'和'\\1'有什么不同?
p true or true and false中会显示true,但在a=true if true or true and false中却不会把true赋值给a。
p(nil || "")什么事儿都没有,可p(nil or "")却会报错呢? :exit这种带:的标识符表示什么?它叫做符号对象,它与标识符之间是1对1的关系。您也可以使用"exit".intern来得到它。在catch, throw, autoload等方法中,既可以使用字符串参数,又可以使用符号参数。
在symbol的作用域内,使用eval((:symbol).id2name)来取值。
a = 'This is the content of "a"' b = eval(:a.id2name) a.id == b.id
loop是控制结构吗?不,它是方法。该块会导入新的局部变量的作用域。
a +b报错,这是怎么回事儿?它会被解释成a(+b)。+的两侧要么都有空格,要么就都没有。
s = "x"; puts s *10 报错,这是怎么回事儿?puts s *10会被解释成s(*10)的方法调用,所以要么s*10这样,要么s * 10这样。
p {}没有任何显示呢?{}会被解释成块,而并非哈希表的构造函数。所以您需要使用p({})或者p Hash.new来解决这个问题。
请看下例。
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调用。
'\1'和'\\1'有什么不同?没有不同,二者完全一样。在单引号中,只有\'、\\和行尾的\(取消换行)会得到特殊的解释,其他字符不变。
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的优先度相同,所以就会从左到右地完成解析。
p(nil || "")什么事儿都没有,可p(nil or "")却会报错呢?虽然||可以连接参数,但or就只能连接句子,所以如此。关于这点区别,您试一试下面的例子就明白了。
p nil || "" p nil or ""