它叫做符号对象,它与标识符之间是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 ""
文章来源于领测软件测试网 https://www.ltesting.net/