Рубиновый двойной вопросительный знак
Я наткнулся на этот кусок кода ruby:
str[-1]==??
Что такое двойной знак вопроса? Никогда не видел этого раньше.
Ответы
Ответ 1
Ruby 1.8 имеет синтаксис? -prefix, который превращает символ в его кодовое значение 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] # => "?"
Ответ 2
Как говорит Райан, префикс ?
дает вам значение 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