Почему имя переменной не может заканчиваться символом `?`, А имя метода может?

Имя метода может заканчиваться вопросительным знаком ?

def has_completed?
  return count > 10
end

но имя переменной не может.

В чем причина этого? Не так ли удобно, чтобы имена переменных заканчивались одинаково? Учитывая, что мы обычно не можем определить, является ли foobar метод или переменная, просто глядя на имя foobar, почему исключение для случая ??

И как мне с этим работать? Может быть, всегда использовать has или is в коде?

if process_has_completed
  ...
end

if user_is_using_console
  ...
end

Ответ 1

Вам нужно попросить Маца получить авторитетный ответ. Однако

  • Ruby - это нетипизированный язык программирования, а переменная типа finished? будет означать определенный тип (логический), который выглядит несколько противоречивым мне.
  • Вопрос несколько требует приемника (который может ответить на вопрос). Метод должен иметь приемник (объект, на который вызывается метод), поэтому вопросительный знак имеет смысл. С другой стороны, переменная не имеет приемника, это просто контейнер.

Ответ 2

Теперь это всего лишь мысль, но я думаю, что методы с именами, такими как empty?, предполагают, что какой-то чек должен быть сделан внутри, а также объект или класс (в зависимости от контекста). Эта проверка или оценка означает, что необходимо выполнить действие. В целом, поскольку мы запрашиваем (например, ?) объект для некоторого состояния, означает, что существует возможность изменения состояния объекта на протяжении жизненного цикла приложения. Переменная может быть устаревшей, но ? -метод (check) будет выполнен в определенный момент, таким образом, предоставляя обновленную информацию о каком-либо состоянии, которое может быть представлено в виде булина.

Поэтому я хотел бы подумать, что это конструктивное ограничение, предоставляемое архитектором (Matz), для обеспечения более логичного подхода к кодированию, близкого к реальному.