Давайте напишемо функцію обчислення факторіалів. Математичне визначення факторіалу від n наступне:
n! = 1 (когда n==0) = n * (n-1)! (иначе)
У Ruby це може бути записано так:
def fact(n) if n == 0 1 else n * fact(n-1) end end
Ви можете помітити, що оператор end тут повторюється. Ruby через це називають Алоголо-подібним. (Насправді синтаксис Ruby більше схожий на синтаксис мови Eiffel.) Ви також можете помітити, що відсутній оператор return . Він не потрібен, оскільки Ruby повертає останнє значення з яким вийшов з функції. Використання оператора return* можливе, але не обов'язково.
Давайте опробуємо висновок нашого факторіалу. Додамо один рядок коду, який дасть нам робочу програму з висновком:
# Программа находит факториал от числа # Сохраните этот файл как fact.rb def fact(n) if n == 0 1 else n * fact(n-1) end end print fact(ARGV[0].to_i), "\n"
Тут присутній масив ARGV, який містить аргументи команди, і конвертування символів рядка в цілісну змінну (integer).
% ruby fact.rb 1 1 % ruby fact.rb 5 120
Давайте запустимо програму з аргументом 40. Це може призвести Ваш калькулятор до переповнення.
% ruby fact.rb 40 815915283247897734345611269596115894272000000000
Але це працює. Насправді Ruby може працювати з будь-яким цілим числом, з яким дозволяє працювати пам'ять комп'ютера. Отже, число 400! Можемо обчислити факторіал і для нього:
% ruby fact.rb 400 64034522846623895262347970319503005850702583026002959458684 44594280239716918683143627847864746326467629435057503585681 08482981628835174352289619886468029979373416541508381624264 61942352307046244325015114448670890662773914918117331955996 44070954967134529047702032243491121079759328079510154537266 72516278778900093497637657103263503315339653498683868313393 52024373788157786791506311858702618270169819740062983025308 59129834616227230455833952075961150530223608681043329725519 48526744322324386699484224042325998055516106359423769613992 31917134063858996537970147827206606320217379472010321356624 61380907794230459736069956759583609615871512991382228657857 95493616176544804532220078258184008484364155912294542753848 03558374518022675900061399560145595206127211192918105032491 00800000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000
Ми не можемо перевірити правильність цього висновку досить швидко, але він має бути вірним.
Введення та цикл обчислень
Коли Ви викликаєте Ruby без аргументів, він зчитує команди зі стандартного введення і виконує його після закінчення введення:
% ruby print "hello world\n" print "good-bye world\n" ^D hello world good-bye world
Ruby також поставляється з програмою, яка називається eval.rb, яка дозволяє вам вводити код Ruby з клавіатури в інтерактивному циклі, показуючи вам результат у міру вашого просування. Це буде використовуватись протягом цього посібника.
Якщо Ви маєте ANSI-сумісний термінал (це буде вірним, якщо ви запускаєте програми під UNIX; під DOS Вам потрібно встановити ANSI.SYS або ANSI.COM (на момент перекладу ці утиліти не потрібно встановлювати)), Вам доведеться використовувати наступну програму eval .rb , яка додасть візуальний помічник відступів, звіти про помилки та підсвічування синтаксису. Або ж, пошукайте піддиректорію sample у постачанні Ruby для non-ANSI версії, яка працює у будь-якому терміналі. Нижче наведена коротка сесія eval.rb:
% ruby eval.rb ruby> print "Hello, world.\n" Hello, world. nil ruby> exit
hello world надається висновком print. Наступний рядок, у даному випадку nil , повідомляє про останнє отримане значення; Ruby не розрізняє оператори і вирази, тому результат шматка коду в основному означає те саме, що результат виконання функції. Тут nil означає, що print не повертає жодного значення. Зауважте, що ми можемо вийти з циклу інтерпретатора, повідомивши йому exit, хоча Ctrl + D також спрацює.
Протягом цього посібника, "ruby>" позначає введення для нашої корисної маленької програми eval.rb.