Іноді в Рубі я бачу методи, які мають "?" і "!" наприкінці їх, наприклад:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Мені було цікаво, яке їх призначення? Вони просто синтаксис цукрового покриття?
Іноді в Рубі я бачу методи, які мають "?" і "!" наприкінці їх, наприклад:
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
двійкові дані?".
Array#clear
, Наприклад. Це очищає масив. Очищення масиву природно мутує його. У цьому немає нічого дивного, ім'я вже дає зрозуміти, отже: жодного удару. Див. Ruby-forum.com/topic/176830#773946 .
Знак питання вказує на те, що метод повертає булевий. Тут уже відповіли:
Що означає оператор знака питання у Ruby?
Вибух вказує на те, що метод діє на сам об’єкт. Тут уже відповіли:
У Ruby ?
означає, що метод збирається повернути булевий і !
модифікує об'єкт, на який він викликався. Вони там, щоб поліпшити читабельність при перегляді коду.
На відміну від - я думаю - більшості мов програмування ...
Рубі, методи дозволяється закінчувати знаками запитання або знаками оклику.
За умовою, методи, які відповідають на запитання (тобто Array # empty? Повертає true, якщо приймач порожній), закінчуються знаками запитань.
Потенційно «небезпечні» методи (тобто методи, що змінюють «я» або «аргументи», «вихід!») За умовами закінчуються знаками оклику.
Від: http://www.ruby-lang.org/uk/documentation/ruby-from-other-languages/ , розділ Імена прикольних методів
?
, називають предикатними методами.
Остерігайтеся, це не завжди так. Візьмемо для прикладу Ruby Array # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat .
Там, де можна погано спалити, щось подібне MyActiveRecordModel.column_names.concat([url])
. Пізніші дзвінки, пов’язані з MyActiveRecordModel, спробують шукати стовпчик 'url' для MyActiveRecordModel і кидають.
Натомість ви повинні клонувати його перед тим, як робити конват. На щастя, мій тестовий набір зловив цього, але .. голова!