Частина друга: Особливості Ruby
Попередня стаття: Моя перша програма на Ruby
Деякі особливості Ruby
- Вільне форматування - ви можете починати писати код з будь-якого рядка чи колонки;
- Чутливість до регістру - маленькі і великі літери відрізняються, end і END — різні ключові слова;
- Коментарі - все, що не є в лапках і стоїть після "#", ігнорується інтерпретатором до кінця рядка. Якщо ви бажаєте залишити коментар в декілька рядків, то почніть перший рядок з "=begin", а останній - з "=end";
- Розділення операторів - декілька операторів, які записані в один рядок, повинні бути розділені крапкою з комою (;), але вона не потрібна наприкінці рядка, який сам інтерпретується, як крапка з комою. Якщо така поведінка є небажаною, то треба ставити наприкінці рядку зворотний слеш;
- Ключові слова - також відомі як зарезервовані слова (близько 41-го), як правило, не можуть бути використані для цілей, які відрізняються від вбудованих. Можливо ви звикли до того, що false може бути представленим у вигляді нуля, порожнього рядка чи нульового символу, але в Ruby всі ці значення інтерпретуються як true; в Ruby все true, крім зарезервованих слів і нуля. У більшості мов ключові слова можна було б назвати "зарезервованими словами" через заборону на використання їх в якості назв для ідентифікаторів. Парсер Ruby є гнучким і не буде скаржитися, якщо ви будете використовувати ключові слова для імен класів чи глобальних змінних, додаючи до них префікси "@", "@@" або "$".
Числа в Ruby
Давайте пограємо числами. В Ruby числа без дробової частини інтерпретуються як integer, а з нею як float. Integer - буквально послідовність цифр, такі, як 0, 123 або 0987654321. Нижнє підкреслення ігнорується, якщо воно є у складі integer-числа, але не стоїть на початку або наприкінці. Це іноді використовується для розподілу числа, наприклад, як роздільник тисяч: 1_000_000_000. Ось листинг програми p002rubynumbers.rb:
# p002rubynumbers.rb
=begin
Числа Ruby
Стандартні оператори:
+ додавання
- віднімання
* множення
/ ділення
=end
puts 1 + 2
puts 2 * 3
# Цілочисельне ділення
# Коли ви виконуєте арифметичні операції з цілими числами, ви отримуєте ціле число в якості результату
puts 3 / 2
puts 10 - 11
puts 1.5 / 2.6
Оператори та порядок виконання
Давайте поглянемо на оператори Ruby. У цій таблиці вони відсортовані за своїм пріоритетом:
| Метод | Оператор | Опис |
|---|---|---|
| ● | [] []= | Посилання на елемент, набір елементів |
| ● | ** | Піднесення до степеня |
| ● | ! ~ + - | Заперечення, доповнення, унарні плюс та мінус (методи для останніх двох матимуть назви "+@" і "-@") |
| ● | * / % | Множення, ділення, ділення з остачею |
| ● | + - | Плюс та мінус |
| ● | >> << | Зсув праворуч та зсув ліворуч ("<<" також використовується для конкатенації) |
| ● | <= < > >= | Оператори порівняння |
| ● | <=> == === != =~ !~ | Оператори рівності та зіставлення зі зразком |
| && | Логічне "і" | |
| || | Логічне "або" | |
| .. ... | Оператор області значень (включний та виключний) | |
| ?: | Тернарний "if-then-else" | |
|
= %= /= -= += |= &= >>= <<= *= &&= ||= **= ^= |
Оператори присвоєння | |
| not | Логічне заперечення | |
| or and | Логічне "або" та "і" | |
| if/unless/while/until | Модифікатори виразу | |
| begin/end | Оператори початку та кінця блоку |
Оператор ділення з остачею в Ruby поводиться так, як показано нижче:
puts (5 % 3) # результат: 2
puts (-5 % 3) # результат: 1
puts (5 % -3) # результат: -1
puts (-5 % -3) # результат: -2
Визначення цього оператору в Ruby відрізняється від аналогічних в C та Java: 7%3=2, коли в C або Java ми б отримали б "-1" в якості відповіді. В Ruby знак результату для оператора ділення з остачею завжди такий самий як знак другого операнда ("3" у нашому прикладі).
Різниця між операторами та "||"
Обидва оператори повертають свій перший аргумент, якщо твердження вірне (true), в іншому випадку вони повертають другий аргумент після виконання порівняння. Приклад:
puts nil || 2008
puts false || 2008
puts "ruby" || 2008
Результат роботи буде таким:
>ruby test.rb
2008
2008
ruby
>Exit code: 0
Ми бачимо, що єдина відмінність полягає в різниці пріоритетів цих операторів — "||" пріоритетніший за "or".
Загальноприйнятою ідіомою є використання "||" для присвоєння значення змінної, тільки якщо ця змінна до цього не була задана:
@variable = @variable || "default value"
Або більш ідіоматично:
@variable ||= "default value"
Однією з причин, чому існують альтернативні версії цих булевих операторів, є факт того, що вони мають більш низький пріоритет, ніж оператори присвоєння. Це означає, що ви можете використовувати такий булевий вираз, який буде присвоювати значення змінній, доки не наштовхнеться на "false":
if a = f(x) and b = f(y) and c = f(z) then d = g(a,b,c) end
Якби ми використовували "&&" замість "and", вираз би не працював, як належить.
def g *args # Зірочка дозволяє використовувати декілька аргументів у вигляді масива
args # Повертає масив
end
def f arg
arg
end
x,y,z = [true, 'two', false] # Паралельне присвоєння
if a = f(x) and b = f(y) and c = f(z) then
d = g(a,b,c) # Повернуто масив, який зберігається у змінній "d"
end
Веселощі з рядками
Рядок (string) буквально являє собою послідовність символів, які розділені одинарними або подвійними лапками. Порожні одинарні лапки ('') називаються пустим рядком.
Ось вміст програми p003rubystrings.rb, який проливає деяке світло на рядки у Ruby:
# p003rubystrings.rb
=begin
Рядки в Ruby
В Ruby рядки є змінюваними
=end
puts "Hello World"
# Можна використовувати " або' для рядків, але використання ' більш раціональне
puts 'Hello World'
# Об'єднання рядків
puts 'I like' + ' Ruby'
# Керуюча послідовність
puts 'It\'s my Ruby'
# Друкує рядок тричі
puts 'Hello' * 3
# Визначення постійної
# Більш докладніше про постійні у наступних статтях
# http://rubylearning.com/satishtalim/ruby_names.html
PI = 3.1416
puts PI
Варто знати про один з різновидів рядків, які обрамовані зворотними апострофами:
puts `dir`
Результатом роботи цього оператора буде виконання команди в контексті операційної системи, в якій наш скрипт запущено, тобто у даному випадку буде викликана команда, яка відображає файли та підпапки тієї папки, в якій знаходиться наш скрипт, і все це буде надруковано за допомогою "puts".
Еквівалентна команда в Linux та Mac:
puts `ls`
Інший спосіб створити відокремлений процес — використання методу "system", який надається ядром, (метод об'єкта "Kernel"). Метод виконує отриману команду у окремому процесі та повертає "true", якщо команда існує і була коректно виконана, "false", якщо команда повернула ненульовий код відповіді, або "nil", якщо виконати команду не вдалося. Пам'ятайте, що результат виконання команди, повертається в те місце, звідки вона викликалася.
system("tar xzf test.tgz") # => true
Джерело: http://rubylearning.com
553 6

Коментарі:
0
John Pixel