Files
SecondBrain/99 System/Archive/Знания Ruby.md
T
2026-05-26 21:21:43 +03:00

211 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 поддерживает множество видов условных конструкций, которые иногда способны сделать код чуть проще и прямолинейнее. Все они встречаются в реальном коде регулярно.
## Тернарный оператор
Работает и выглядит аналогично другим языкам:
```
# <expr1> ? <expr2> : <expr3>
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
```