Попередня стаття: Моя перша програма на 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
Integer є об'єктом класу Fixnum або Bignum в залежності від того, якого він розміру. Floating-point числа належать до класу Float, який відповідає реалізованому архітектурно double-data типу. Класи Complex, BigDecimal та Rational не є вбудованими в Ruby, але постачаються разом зі стандартною бібліотекою. Ми поговоримо докладніше про класи у наступних статтях.
Оператори та порядок виконання
Давайте поглянемо на оператори Ruby. У цій таблиці вони відсортовані за своїм пріоритетом:
Метод | Оператор | Опис |
---|---|---|
● | [] []= | Посилання на елемент, набір елементів |
● | ** | Піднесення до степеня |
● | ! ~ + - | Заперечення, доповнення, унарні плюс та мінус (методи для |
останніх двох матимуть назви "+@" і "-@") | ||
● | * / % | Множення, ділення, ділення з остачею |
● | \+ - | Плюс та мінус |
● | >> << | Зсув праворуч та зсув ліворуч ("<<" також |
використовується для | ||
конкатенації) | ||
● | <= < > >= | Оператори порівняння |
● | <=> == === != =~ !~ | Оператори рівності та зіставлення зі зразком |
&& | Логічне "і" | |
.. ... | Оператор області значень (включний та виключний) | |
?: | Тернарний "if-then- | |
else" | ||
= %= /= -= += |= &= >>= <<= *= &&= ||= **= ^=
| Оператори присвоєння
| not | Логічне заперечення
| or and | Логічне "або" та "і"
| if/unless/while/until | Модифікатори виразу
| begin/end | Оператори початку та кінця блоку
а. В Ruby немає інкремента та декремента ні в "pre" (++i) ані в "post" (i++) вигляді. Зауважте, що оператори "+=", "-=" доступні.
b. Дужки (круглі) поводяться згідно з правилами звичайної арифметики. Усе, що знаходиться у дужках, отримує підвищення пріоритету та виконується у першу чергу.
с. Відмічені у таблиці оператори є різновидом синтаксичного цукру (більш докладніше у наступних статтях), -- коли щось виглядає як оператор, але насправді є методом.
Оператор ділення з остачею в 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" **передається послідовність, яка не є рядком, тобто не є об'єктом типу "string", то "puts" автоматично викличе метод "to_s" для цього об'єкта, та надрукує те, що цей метод повернув.
b. Рядки в Ruby змінювані, вони можуть розширюватись або зазнавати будь-яких інших змін, не використовуючи багато часу та пам'яті, через те що зберігаються у вигляді послідовності символів.
Варто знати про один з різновидів рядків, які обрамовані зворотними апострофами:
puts `dir`
Результатом роботи цього оператора буде виконання команди в контексті операційної системи, в якій наш скрипт запущено, тобто у даному випадку буде викликана команда, яка відображає файли та підпапки тієї папки, в якій знаходиться наш скрипт, і все це буде надруковано за допомогою "puts".
Еквівалентна команда в Linux та Mac:
puts `ls`
Інший спосіб створити відокремлений процес -- використання методу "system", який надається ядром, (метод об'єкта "Kernel"). Метод виконує отриману команду у окремому процесі та повертає "true", якщо команда існує і була коректно виконана, "false", якщо команда повернула ненульовий код відповіді, або "nil", якщо виконати команду не вдалося. Пам'ятайте, що результат виконання команди, повертається в те місце, звідки вона викликалася.
system("tar xzf test.tgz") # => true
Ще немає коментарів