Рубиновый двойной вопросительный знак

Я наткнулся на этот кусок кода 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