Іноді в Рубі я бачу методи, які мають "?" і "!" наприкінці їх, наприклад:
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 і кидають.
Натомість ви повинні клонувати його перед тим, як робити конват. На щастя, мій тестовий набір зловив цього, але .. голова!