--- status: seed type: concept tags: [] created: 2025-12-17 updated: 2026-05-26 aliases: - Знания Ruby --- # Знания Ruby ## Значение по умолчанию В Ruby широко используется такой код: ``` a ||= 'что-то' # a = a || 'что-то' ``` Он используется для задания значения по умолчанию. Такое возможно и почти всегда безопасно из-за очень ограниченного списка _falsey_ значений. Единственное место, где этот способ не сработает – там, где `false` это допустимое значение. ## Предикаты В Ruby в отличие от большинства других языков принято использовать предикаты практически для всех часто встречающихся проверок. Например, как мы обычно проверяем, что число равно нулю? С помощью сравнения с нулем. В Ruby это тоже работает, но это не Ruby Way: ``` 0.zero? # true 1.zero? # false 2.positive? # true # чётное/нечётное 8.even? # true 8.odd? # false ''.empty? # true 'wow'.empty? # false something.nil? # не пустой массив items.any? # пустой массив items.empty? ``` ## Логические операторы Логический тип в Ruby представлен привычными значениями `true` и `false`, а также набором операторов `&&` (и), `==` (равно), `||` (или) и `!` (не): ``` true && false # false false || true # true ``` В отличие от многих других языков сравнение с логическим значением в Ruby строгое, то есть `true` и `false` равны только самим себе: ``` true == 1 # false false == nil # false ``` Что не отменяет возможности использовать в логических выражениях значения любых типов: ``` 0 && 'one' # "one" nil && false # nil ``` В Ruby только `nil` и `false` рассматриваются как _falsey_, все остальные значения в логических выражениях приводятся к `true`. Условия в Ruby выглядят похожими на условия в других языках: ``` def sentence_type(text) # проверяем последний символ в строке if text.end_with?('?') 'question' # снова нет return elsif text.end_with?('!') 'exclamation' # и тут else 'statement' # и тут end end sentence_type 'anybody here?' # question sentence_type 'Hexlet for humans' # statement sentence_type 'boo!' # exclamation ``` В Ruby условиям не нужны скобки. Выражения пишутся сразу после ключевого слова `if`. Для дополнительных условий используется ключевое словое `elsif`. И для всего остального — привычный `else`. В конце добавляется `end`. В примере используется предикат (функция, возвращающая `true` или `false`) `end_with?()`. Ключевое отличие Ruby от других популярных языков — в использовании знака вопроса на конце, вместо `is` и его аналогов в начале. Этот подход перекочевал из Lisp-языков. --- В Ruby встроен оператор `<=>` (spaceship). Этот оператор удобно использовать в функциях сортировки для определения того, нужно менять местами два соседних элемента или нет. Всего у функции возможны три разных варианта возврата: ``` 1 <=> 1 # 0 числа равны 2 <=> 1 # 1 левое больше правого 1 <=> 2 # -1 левое меньше правого ``` # Ruby: Условные конструкции (альтернативные варианты) Ruby поддерживает множество видов условных конструкций, которые иногда способны сделать код чуть проще и прямолинейнее. Все они встречаются в реальном коде регулярно. ## Тернарный оператор Работает и выглядит аналогично другим языкам: ``` # ? : v = 3 == 4 ? 1 : 0 ``` ## Постфиксный if В Ruby _if_ может стоять не только в начале, но и в конце выражений: ``` do_something() if num.zero? ``` Подобную форму записи принято использовать тогда, когда все выражение помещается в одну строчку. ## Unless В дополнение к _if_, в Ruby есть конструкция _unless_, которая работает в обратную сторону: ``` # Пока (если) something не zero? unless something.zero? # что-то делаем end ``` _unless_ позволяет избавляться от отрицаний, но с ним нужно быть осторожным. Если в предикате используется составное логическое выражение, то _unless_ становится не читаемым: ``` # Попробуйте осознать этот код unless a && b end ``` # Ruby: Строки Базовые операции со строками в любом языке – это интерполяция и конкатенация. Как это делается на Ruby: ``` # Конкатенация name = 'H' + 'e' + 'x' + 'l' + 'e' + 't' # Hexlet # Можно даже так name = 'H' 'e' 'x' 'l' 'e' 't' # Hexlet # Интерполяция greeting = "hello #{name}" # hello Hexlet ``` Интерполяция выполняется только в строках с двойными кавычками. Строки, состоящие из одиночных кавычек, воспринимаются "как есть" — по аналогии с PHP. ``` line_feed = "one line\nanother one" # one line # another one ``` Как и в большинстве других языков, интерполяция в Ruby предпочтительнее конкатенации. Помимо стандартных конкатенации и интерполяции, строки в Ruby усилены срезами и большим числом полезных методов. Вот лишь некоторые примеры: ``` name = 'ruby' name.upcase # 'RUBY' ''.empty? # true name.include? 'ru' # true name.capitalize # Ruby name.length # 4 ``` Одна из самых классных возможностей у строк – слайсы. С их помощью можно находить любую подстроку в строке. Слайс — тоже метод, но с дополнительным синтаксисом из квадратных скобок: ``` name = 'ruby' # второй символ (счёт идёт с нуля) name[1] # u # Последний символ name[-1] # y # два символа, начиная с нулевого индекса name[0, 2] # ru # от первого до второго с конца name[0..-2] # rub # от 4 с конца до последнего символа name[-4..] # ruby # и даже регулярные выражения! name[/ru/] # ru ``` ```ruby # frozen_string_literal: True # BEGIN (write your solution here) def prepare_card_for_display(num) "**#{num[-4..]}" end # END ```