Иногда я вижу методы в Ruby, которые имеют "?"а также "!"в конце их, например:
name = "sample_string" name.reverse name.reverse! name.is_binary_data?
Мне было интересно, какова их цель?Это просто синтаксис сахарного покрытия?
Это «просто приукрашивание» для удобства чтения, но у них есть общие значения:
!
Enumerable#sort
Enumerable#sort!
ActiveRecord::Base#save
ActiveRecord::Base#save!
Kernel::exit
Kernel::exit!
?
if number.zero?
if number.zero
В вашем примере name.reverse оценивается как перевернутая строка, но только после строки name.reverse! переменная name фактически содержит перевернутое имя. name.is_binary_data? выглядит как "это name двоичные данные?".
name.reverse
name.reverse!
name
name.is_binary_data?
Вопросительный знак указывает, что метод возвращает логическое значение.Уже здесь ответили:
Что означает оператор знака вопроса в Ruby?
Удар означает, что метод воздействует на сам объект.Уже здесь ответили:
Почему восклицательные знаки используются в методах Ruby?
В Ruby ? означает, что метод будет возвращать логическое значение, а ! изменяет объект, для которого он был вызван. Они предназначены для улучшения читабельности при просмотре кода.
В отличие от - я полагаю - большинства языков программирования ...
Ruby, методы могут заканчиваться знаком вопроса или восклицательным знаком. По соглашению методы, которые отвечают на вопросы (например, Array # empty? Возвращает true, если получатель пуст), заканчиваются вопросительными знаками. Потенциально «опасные» методы (т. Е. Методы, которые изменяют себя или аргументы, выходят и т. Д.) По соглашению заканчиваются восклицательными знаками.
Ruby, методы могут заканчиваться знаком вопроса или восклицательным знаком.
По соглашению методы, которые отвечают на вопросы (например, Array # empty? Возвращает true, если получатель пуст), заканчиваются вопросительными знаками.
Потенциально «опасные» методы (т. Е. Методы, которые изменяют себя или аргументы, выходят и т. Д.) По соглашению заканчиваются восклицательными знаками.
От: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/, Раздел Смешные имена методов
Осторожно, это не всегда так.Например, Ruby Array # concat http://docs.ruby -lang.org / ru / 2.0.0 / Array.html # method-i-concat .
Где вы можете сильно обгореть - это что-то вроде MyActiveRecordModel.column_names.concat([url]).Более поздние вызовы, связанные с MyActiveRecordModel, попытаются найти столбец 'url' для MyActiveRecordModel и выполнить команду throw.
MyActiveRecordModel.column_names.concat([url])
Вместо этого вы должны клонировать его перед выполнением конкатата.К счастью, мой тестовый набор поймал этот, но .. хедз-ап!