Как это допустимое утверждение ruby?

#ruby

Вопрос:

 ???? : ??
 

Недавно я был на встрече с ruby, и это заявление было опубликовано как действительное заявление ruby. Может ли кто-нибудь объяснить его действительность и, если возможно, версии, в которых он действителен.

Комментарии:

1. Это неверно, но, возможно, это не совсем то, что было показано на той встрече.

Ответ №1:

Вполне вероятно, что вам не хватает одного вопросительного знака перед двоеточием: (пробел в нем не нужен, однако это лучше имитирует ваш исходный пост)

 ????? : ??
 

Вышесказанное справедливо, потому что интерпретатор распознает это утверждение как:

 ?? ? ?? : ?? 
 

При этом используется буквальное обозначение символа:

символьная литеральная нотация для представления строк с одним символом, синтаксисом которых является знак вопроса (?), за которым следует один символ или escape-последовательность, соответствующая одной кодовой точке в кодировке сценария

А также троичный, если [condition] ? true : false

Поскольку каждый объект , отличный от NilClass или FalseClass , считается «правдивым» в ruby, предлагаемое утверждение разбивается на :

 ????? : ??
"?" ? "?" : "?"
true ? "?" : "?" 
"?"
 

Это предупредит о строковом литерале в условии, поскольку ветвь else недоступна

Что касается «…версий, в которых это действительно». Этот синтаксис, по-видимому, всегда был действителен (хотя я тестировал его только до версии 1.8.7 (2008)). Тем не менее, результат, который вы испытываете сегодня, произошел в 1.9.

В 1.8.7 та же инструкция вернет 63 десятичную кодовую точку ASCII для знака вопроса.

Ответ №2:

Этот вариант действителен: (и тот, который вы видели, вероятно, работает аналогично)

 ????::??
 

Это интерпретируется как:

 ?? ? ?: : ??
 

С ?? и ?: являющимися (редко используемыми) строковыми литералами и ? / : являющимися тернарным оператором.

Это то же самое, что:

 if '?'
  ':'
else
  '?'
end
 

Вне контекста это не делает ничего полезного.

Комментарии:

1. Это также очень справедливо. Аналогичное объяснение в качестве принятого ответа

Ответ №3:

Недавно я был на встрече с ruby, и это заявление было опубликовано как действительное заявление ruby.

Тот факт, что он был опубликован как действительный, не делает его таковым.

Может ли кто-нибудь объяснить его действительность

Это не так.

и, если возможно, версии, в которых он действителен.

Нет.