Частина друга: Особливості Ruby

8 хв. читання

Попередня стаття: Моя перша програма на 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

Оператори та порядок виконання

Давайте поглянемо на оператори 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
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.6K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація