Этот вопрос уже имеет ответ здесь:
Я столкнулся с этой частью кода Ruby:
str[-1]==??
О чем является двойной вопросительный знак всеми? Никогда замечаемый это прежде.
Ruby 1.8 имеет синтаксис префикса?, Который превращает символ в его кодовое значение ASCII. Например, ? A
- это значение ASCII для буквы a
(или 97). Двойной вопросительный знак, который вы видите, на самом деле представляет собой просто число 63
(или значение ASCII для ?
).
?a # => 97
?b # => 98
?c # => 99
?\n # => 10
?? # => 63
Для обратного преобразования можно использовать метод chr
:
97.chr # => "a"
10.chr # => "\n"
63.chr # => "?"
??.chr # => "?"
В Ruby 1.9 синтаксис ? A
возвращает сам символ (как и синтаксис квадратных скобок для строк):
?? # => "?"
"What?"[-1] # => "?"
Как говорит Райан, ?
префикс дает вам значение 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