--- status: seed type: concept tags: [] created: 2025-12-17 updated: 2026-05-26 title: Знания 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 ```