2010-02-06 62 views

回答

21

Ruby 1.8有一个?-prefix语法,可以将一个字符转换为其ASCII码值。例如,?a是字母a(或97)的ASCII值。您看到的双重问号实际上只是数字63(或?的ASCII值)。

?a # => 97 
?b # => 98 
?c # => 99 
?\n # => 10 
?? # => 63 

要转换回来,你可以使用chr方法:

97.chr # => "a" 
10.chr # => "\n" 
63.chr # => "?" 

??.chr # => "?" 

红宝石1.9,则?a语法返回字符本身(如确实对字符串方括号语法):

??   # => "?" 

"What?"[-1] # => "?" 
+0

准确地说,在1.9中不推荐使用'?'语法,因为目前它的用途很小? – 2010-02-06 16:13:40

+0

Myrddin,这可能是一个公平的事情说。 1.9中使用'?'语法的用处不大。 – 2010-02-09 14:05:28

2

正如Ryan所说,?前缀为您提供了字符的ASCII值。在这种情况下这很有用的原因是,当你在Ruby 1.8的字符串中使用索引表示法时,返回的是ASCII值而不是字符。例如

irb(main):009:0> str = 'hello' 
=> "hello" 
irb(main):010:0> str[-1] 
=> 111 

所以下面不考,如果一个字符串的最后一个字符是字母 'O'

irb(main):011:0> str[-1] == 'o' 
=> false 

但这:

irb(main):012:0> str[-1] == ?o 
=> true 

和(前提是你懂得这是什么?)这比

irb(main):013:0> str[-1] == 111 
=> true 
+1

以上适用于Ruby 1.8,而不是1.9,其中''hello“[ - 1] ==”o“' – 2010-02-06 18:00:54

+2

这就是为什么在ruby19中使用'?o ==”o“', “hello”[ - 1] ==?o'在ruby18和ruby19中。 – rampion 2010-02-06 18:11:42

+0

谢谢glenn,我已经更新了答案,以澄清只适用于1.8的位 – mikej 2010-02-06 20:11:51