Типи даних, змінні, оператори в Ruby. Strings, Numeric, Array, Hashes

Типи даних, змінні, оператори в Ruby. Strings, Numeric, Array, Hashes

Ruby 🇺🇦

Сьогодні на уроці:

Завантажити сьогоднішній матеріал файлом можна тут.

Типи даних 


В попередньому уроці ми трішки почали розглядати тему типів даних, а в цьому детальніше розповім про «найпопулярніші» з них та деякі їх методи. 

Тип даних — це деякий клас об`єктів даних разом з набором методів для створення і роботи з ними і діапазоном допустимих значень. 

Ієрархія класів Ruby: 

  • Оbject: 

· NilClass; 

· TrueClass; 

· FalseClass; 

· Numeric; 
·· Integer; 
··· Fixnum — цілі числа до 230 за модулем; 
··· Bignum — ціле число понад 230 за модулем; 

·· Float — дійсне число з рухомою комою; 

·· Complex; 

· Time; 

· Date; 

· String — рядок (символів); 

· Range — діапазон; 

· Struct; 
·· Struct::Tms; 

· Array — масив; 

· Hash — асоціативний масив; 

Давайте подивимося як зрозуміти з яким ми класом взагалі працюємо і який є суперклас(якщо він є): 


String (рядок) 


String (рядок) — послідовністю символів, обмежених з обох боків або подвійними лапками, або апострофами. В Ruby для опису рядків і роботи з ними використовують напрацювання мови Perl. Це дає такі можливості: 

  • необмежена довжина рядка; 
  • можливість змінювати довжину протягом виконання програми; 
  • довільний об'єкт можна перетворити на рядок (методами .inspect и .to_s); 
  • є велика бібліотека методів (.gsub, .match, .scan, .split) для роботи з правилами; 
  • рядки, створенні подвійними лапками, можна вставляти довільні змінні, використовуючи інтерполяцію #{ і }. Після виконання код буде заміщено результатом. 


Що таке інтерполяція String? 

Інтерполяція string-ів дозволяє комбінувати рядки разом: 

Деякі люди не знають, що всередині інтерполяції можна мати реальний код: 

Ruby викликає метод to_s у блоці інтерполяції string-a, це повідомляє об’єкту перетворити себе на string. 


Розглянемо деякі корисні методи string 


  • Як отримати довжину string? 

Ви також можете використовувати length, замість size, він робить те саме. 


  • Як перевірити, чи string порожній 

Або навіть краще використовувати метод empty? 


  • Як дізнатися, чи string містить інший string (певний текст) 

  • Порівняйте string без урахування регістру 

Оскільки порівняння string-ів чутливе до регістру, тому вам потрібно переконатися, що два string-а, які ви порівнюєте, мають однаковий регістр.

Звичайний спосіб зробити це — зробити обидві сторони рівняння меншими (downcase) чи верхніми (upcase). 


  • Як видалити пробіли (white spaces) 

Якщо ви хочете видалити пробіли лише з одного боку (ліворуч/праворуч), замість цього можна використати методи lstrip та rstrip. 


  • Перетворити string на масив символів 

За умовчанням split використовуватиме пробіл як символ роздільника, але ви можете передати аргумент у цей метод, щоб вказати інший роздільник. 

Ось як ви можете розділити список значень, розділених комами: 


  • Перетворення масиву на string

Також можна передати аргумент для об’єднання, цей аргумент є роздільником символів. 


  • Перетворення string на integer (ціле число) 

Якщо ви хочете перетворити string на кшталт "49" на ціле число 49, ви можете скористатися методом to_i  

Зауважте, що якщо ви спробуєте це з string-ом, який не містить чисел, ви отримаєте 0. 


  • Як замінити текст у string 

Якщо ви хочете замінити текст у string, скористайтеся методом gsub. 

Замінимо слово «dogs» на «cats»: 


  • Перевірти, чи в string лише одні числа 

Хочете знати, чи string складається лише з цілих чисел? 

Цей код використовує регулярний вираз, дозвольте мені перекласти його для вас: 

«З початку рядка (\A) перевірте, чи є додаткове тире (-?, для від’ємних чисел), потім переконайтеся, що там є числа (\d+) і більше нічого до кінця рядка (\Z)."


Numeric 


У Ruby числа використовуються для регулярних обчислень, як і в усіх мовах програмування. Коротше кажучи, усі типи числових даних зібрані в класі типу даних "Numeric"(числовий). І він має кілька підкласів під собою. 

Клас «Numeric» має такі підкласи: 

Numeric: 

  • Integer (“Fixnum” та “Bignum”) 
  • Fixnum (3, цілі числа середнього розміру або цілі) 
  • Bignum (111111111111, величезні цифри) 
  • Float (5.0, нецілі або ж числа з плаваючою точкою з нижчою точністю) 
  • Complex (1+3i, комплексні числа, що використовуються в математиці) 
  • Rational (2/3, щоб показати співвідношення ділення) 
  • BigDecimal (3.0, високоточні нецілі або ж числа з плаваючою точкою) 

 

Ruby 2.4 об’єднав Fixnum і Bignum в один і той самий клас (Integer), але за лаштунками вони все ще працюють так само. Ruby автоматично перемикається з одного типу на інший, без зміни класу. 

Для початкового навчання нам буде достатньо розглянути лише integer та float та їх методи, які вам можуть згодитися в ближчому майбутньому, тому не вартує сильно приділяти увагу всім цим підкласам. 


Integer 


Як і в математиці, цілі числа в комп’ютерному програмуванні – це цілі числа, які можуть бути додатними, від’ємними або 0 (…, -1, 0, 1, …).  

Ви можете вивести ціле число так: 

Результат: -25

Ви також можете зберегти ціле число у зміну, а потім вивести значення, посилаючись на цю змінну: 

Результат: -25

Ви також можете виконувати математичні обчислення з цілими числами. Наприклад, ви можете обчислити суму двох чисел і вивести результат: 

Результат: 48

Float


Float або число з плаваючою комою представляє дійсне число. Дійсні числа можуть бути як раціональними, так й ірраціональними; числа, які містять дробову частину, наприклад 9,0 або -116,42. Іншими словами, число з плаваючою точкою в програмі Ruby — це число, яке містить десяткову кому. 

Ви можете вивести числа з плаваючою точкою в Ruby так само, як це було з цілими числами: 

Результат: 17.3

Ви також можете оголосити змінну та призначити float: 

Результат: 17.3

І так само, як і з цілими числами, ви також можете виконувати математичні обчислення з Float в Ruby. І, якщо додати Float до Iteger в Ruby, ви отримаєте float: 

Результат: 929.24

Ruby «розглядатиме» будь-яке число, записане без десяткової коми, як Integer(ціле число, як 138), а будь-яке число, записане з десятковою комою, як Float(число з плаваючою комою, як 138.0). 


 Integer та Float 


Коли ми пишемо великі числа, ми зазвичай використовуємо коми, щоб їх було легше читати. Наприклад, ми напишемо 1 000 000 для «один мільйон». Ви не можете використовувати коми у своєму коді, але Ruby дозволяє використовувати символ підкреслення _, щоб зробити великі числа більш читабельними.  

Результат: 1234567

Підкреслення дають змогу писати більш читабельний код, якщо вам потрібно представити великі числа у ваших програмах. 


Доступні оператори 


Тепер давайте подивимося на оператори, які можна використовувати з числовими значеннями: 

  • Сумування: + 
  • Віднімання: - 
  • Множення: * 
  • Ділення: / 
  • Знаходження залишку від ділення : % 
  • Ступінь числа: ** 
  • Менше ніж: < 
  • Менше-рівно: <= 
  • Більше ніж: > 
  • Більше-рівно: >= 
  • Рівно, перевіряє рівність чисел: == 

 

Найдивнішим оператором тут може бути %. 

# залишок від 5 поділений на 2 => 1 

Результат: 1

# залишок від 13 поділеного на 5 => 3 

Результат: 3

# 2 у степені 3 => 23 = 8 

Результат: 8

Це методи для перетворення числового значення в щось інше або інший тип числового класу: 

  • to_i (перетворює значення на ціле (на Integer)) 
  • to_f (перетворює значення на число з плаваючою комою (на Float)) 
  • to_s (перетворює числове значення на рядкове значення(на String)) 

Зазвичай ми використовуємо плаваюче значення для ціни, щоб також показати копійки. Отже, давайте перетворимо його на «Float» перед виведенням. Щоб вивести його на екран, давайте перетворимо його на String

Результат: Price of product is 4.0

Таким чином, ми перетворили ціле число на число з плаваючою комою, а потім перетворили його на String, щоб мати можливість виводити його на екран. 

P.S. якщо використовувати інтерполяцію, то метод to_s можна пропустити, оскільки інтерполяція сама перетворю кінцевий код на String 

Результат: Price of product is 4.0

Ще одна річ, яку ми повинні мати на увазі, це деталі операції поділу. Якщо обидва значення, які використовуються під час ділення (дільник або частка), є значеннями класу «Integer», тоді результат також Integer. Якщо одне зі значень у розділі є екземпляром класу "Float", то результат також буде значенням типу "Float". Наприклад: 

 

# Обидва значення є Integer (цілим числом). 

Результат: 3

 Ви могли помилково очікувати результат 3,5 

# Тільки одне зі значень є цілим числом. 

Результат: 3.5

# Давайте використаємо метод to_f 

Результат: 3.5


 Методи Numeric 


Even 

.even? - метод перевіряє, чи є значення, над яким ми працюємо, парним чи ні. Він повертає «true», якщо ціле число парне, і «false», якщо ціле число не парне. 

Результат: false
Результат: true

Odd 

. odd? - метод перевіряє, чи є значення, над яким ми працюємо, непарним чи ні. Він повертає «true», якщо ціле число непарне, і «false», якщо ціле число парне. 

Результат: true
Результат: false

Ceil 

Метод .ceil округлює числові значення типу «Float» до найближчого цілого більшого числа, ніж саме значення. 

Результат: 9
Результат: 7

Floor 

Метод .floor округлює числові значення типу “Float” до найближчого цілого числа, меншого за саме значення. 

Результат: 8
Результат: 6


Array (масиви)


Що таке Array (масив)? 

Масив — це вбудований клас Ruby, який містить список із нуля чи більше елементів і включає в себе методи, які допомагають легко додавати, отримувати доступ і перебирати всі ці елементи. 

Це корисно, тому що якби масиви не існували, вам довелося б використовувати багато змінних, щось типу такого: 

Але, натомість цього, за допомогою масива ви можете зробити так: 

Отже, ще раз. Масив — це впорядкований список елементів будь-якого типу. Ви можете визначити масив, помістивши список елементів у квадратні дужки, як у прикладі зверху. 

Приємна фішечка масивів? Ви можете помістити в масив будь-що! 

Наприклад: 

  • Numbers 
  • Strings 
  • Більше масивів! (це зробило б його багатовимірним масивом) 

Давайте дізнаємося більше про масиви, щоб ви могли використовувати їх якнайкраще! 


Масиви мають нульовий індекс 


Ви можете отримати доступ до елементів усередині масиву, використовуючи їхній індекс, який починається з 0. 

Якби у вас був масив зі словами «кіт», «собака» і «тигр», він мав би такий вигляд: 

Ось приклад коду, який представляє дані на зображенні: 

А тепер давайте дізнаємося, що ми можемо робити з масивами 

 

Методи масивів 


Давайте почнемо з вивчення того, як ви можете створити масив. 

Ви можете створити порожній масив, а потім додати в нього нові елементи, або ви можете створити масив із якимись певними значеннями. 

Ініціалізувати порожній масив: 

Ініціалізація масиву даними: 

Якщо ви створюєте масив лише з рядків, то ви можете уникнути необхідності вводити лапки для кожного рядка, створивши масив за допомогою %w. 

Наприклад: 

Тепер, коли у нас є масив, ви можете отримати доступ до елементів, які він містить. 

Ви також можете використовувати методи first та last: 

Ось як додати елементи до свого масиву: 

Обидва вони мають однаковий ефект, але << є кращим

 Ось як видалити елементи з масиву: 

Вилучає останній елемент із масиву та повертає його

 Або 

Видаляє перший елемент масиву

Є також методи shift та unshift, які подібні до pop/push, але видаляють або додають елементи перед масивом. 

Додає елемент перед масивом
Вилучає перший елемент масиву та повертає його

А як перевірити чи масив містить або включає певний елемент? 

Перевірте, чи існує значення в масиві в Ruby: 

Яка довжина масиву? (Іншими словами, скільки елементів він містить) 

Результат: 3

Ось невелика шпаргалка для вас: 

Масиви Ruby дуже корисні, і вони стануть вашим потужним союзником. 

Є ще дуже багато справді корисних та цікавих методів, але їх буде корисніше вивчати безпосередньо під час практики. 

Обов’язково попрактикуйтесь у створенні масиву, додаванні до нього елементів, доступі до елементів за індексом тощо. Практика робить нас досконалими! 


Hash


Що таке Hash (хеш) в Ruby? 

Hash — це структура даних, яка використовується для зберігання даних у формі УНІКАЛЬНИХ пар ключ-значення. На відміну від масивів, тут немає числових індексів, доступ до хеш-значень здійснюється за допомогою ключів. 


Приклади: 

  • Список назв країн і відповідних кодів країн (наприклад, ES ⇾ Іспанія) 
  • Словник, де кожне слово має список можливих визначень 
  • Доменне та його IP-адреса 

В коді це виглядає наступним чином: 

Ключ – «ES», значення – «Spain»

Хеш із трьома парами ключ/значення виглядає так: 

Де «a» — ключ, а 1 — відповідне значення для цього ключа.

Зверніть увагу, що пари ключ-значення розділені комами. 

Фігурні дужки + ключ зі значенням – так формується хеш. 

Використання хешу у ваших програмах Ruby може пришвидшити ваш код, якщо його використовувати в правильній ситуації. 

Іншими словами - у вас є дані, які є (або можуть бути перетворені в) у форматі словника, де дані можуть бути згруповані за ключами та пов’язаними значеннями. 

Зберігання значень у Hash 


Ви можете створити хеш із набором початкових значень, як це вже було продеменостровано. 

 Іншим варіантом додавання нових значень до існуючого хешу є: 

:orange це хеш-ключ і 4 – це його значення.

 Примітка: 

Чому двокрапка стоїть перед словом :orange, коли ми отримуємо доступ до значення, і після слова orange: коли ми створюємо хеш? Це новіший та кращий синтаксис, який дозволяє створювати хеші без символу хеш-ракети (=>), який є робочим, але старішим способом зробити це. 

Значенням може бути будь-який об’єкт Ruby: 

  • Strings 
  • Integers & Floats 
  • Arrays 

Ключі також можуть бути будь-якими, але символи (наприклад, :banana) і string-и є найпоширенішим типом ключів, які ви зустрінете. 

Пам'ятайте, що ключі унікальні, ми можемо мати лише один ключ :orange або один ключ :apple. Коли ви додаєте той самий ключ двічі, ви змінюєте його значення. 


Як отримати доступ до значень з Hash 


Ви отримуєте доступ до хешу за допомогою ключа. Якщо вам потрібен прямий доступ до значень, то хеш може не підійти для ваших даних. 

Результат: 4

У цьому і полягає суть хешів, щоб швидко знайти елемент за його ключем. 


Якщо ключа не існує, ви отримаєте nil. 

Результат: nil

Як альтернативу ви можете використовувати метод fetch, який дозволяє вказати значення за замовчуванням. 

Якщо ви використовуєте fetch без значення за замовчуванням (2-й аргумент), Ruby викличе exception(виняток) KeyError. 

Це корисно, оскільки ви знатимете, якого ключа не вистачає. 


Як об’єднати два Hash-і 


Ви можете взяти два хеші та об’єднати їх у новий хеш. 

Яким методом це робиться? Що ж, це не важко здогадатися. Метод називається merge (злиття). 

Ось як ним користуватися: 

Результат: {:a=>1, :b=>2, :c=>4}

Зауважте, що оскільки ключі унікальні, нові значення перезаписують старі значення. 

Ви можете використовувати цей факт для цікавих рішень, як-от створення хешу «за замовчуванням», який користувачі можуть змінити, передавши власний хеш. 

Якщо вам потрібно більше контролювати спосіб об’єднання ключів, ви можете передати блок: 

Де старі значення походять із defaults, а нові значення походять із preferences.

 

Кілька значень для одного ключа 


У словнику… Слова унікальні, але вони можуть мати кілька значень (визначень), пов’язаних з ними. Ви можете зробити це в Ruby наступним чином: 

Де dictionary[:creativity] дає вам масив, а [1] дає вам 2-й елемент із цього масиву.

Іншими словами: 

Ключ — це symbol(символ), а значення — масиви. Коли ви отримуєте доступ до хешу, ви отримуєте назад масив, до якого ви можете отримати доступ, як і до будь-якого іншого масиву. 

 

Як відсортувати Hash 


Ви можете сортувати масиви. Але чи знаєте ви, що ви також можете сортувати хеші? Коли ви сортуєте хеш, він сортується за ключем. 

Результат: [[:a, 2], [:b, 1]]

 Але ви також можете сортувати їх за значенням: 

Результат: [[:b, 1], [:a, 2], [:c, 3]]

Ви, напевно, помітили, що те, що ви отримуєте від сортування хешу, не є іншим хешем... А це масив! 

Але ви можете перетворити цей масив назад у хеш за допомогою методу to_h. 

Отримати всі ключі та значення з Hash


Якщо вам потрібен список усіх хеш-ключів, хороші новини, для цього є метод! 

Результат: [:apple, :banana]

Існує також метод, який дає вам масив, що містить значення хешу: 

Результат: [1, 2]

Якщо ви хочете дізнатися, чи існує ключ у хеші, замість того, щоб отримати їх масив, використовуйте метод key?. Цей метод повертає значення true або false. 

Ви дізналися про хеші Ruby, корисну структуру даних, яка складається з пар ключ-значення. Ви також дізналися, як отримати доступ до хешу за ключем і як зберігати нові дані в хеші. Тепер відкрийте irb та почніть практивкуватися з хешами! 

Трохи офіційної документації і ресурсів, де можна «підчерпнути» додатковї інформації. 

Типи даних: 

String: https://ruby-doc.org/3.2.0/String.html 

Integer: https://ruby-doc.org/core-3.1.0/Integer.html 

Float: https://ruby-doc.org/core-3.1.0/Float.html 

Array: https://ruby-doc.org/core-3.1.0/Array.html 

Hash: https://ruby-doc.org/core-3.1.0/Hash.html 

 

Лаконічна практика, без встановлення компілятора: https://try.ruby-lang.org/ 

Завантажити сьогоднішній матеріал файлом можна тут.
















Report Page