Evgenii Legotckoi
18 июня 2016 г. 11:36

User Guide #03 - Ruby - Простые примеры

Давайте напишем функцию вычисления факториалов. Математическое определение факториала от n следующее:

  1. n! = 1 (когда n==0)
  2. = n * (n-1)! (иначе)

В Ruby это может быть записано следующим образом:

  1. def fact(n)
  2. if n == 0
  3. 1
  4. else
  5. n * fact(n-1)
  6. end
  7. end

Вы можете заметить, что оператор end здесь повторяется. Ruby из-за этого называют Алоголо-подобным. (На самом деле синтаксис Ruby больше походит на синтаксис языка Eiffel.) Вы можете также заметить, что отсутствует оператор return . Он не требуется поскольку Ruby возвращает последнее значение с которым вышел из функции. Использование оператора return возможно, но не обязательно.


Давайте опробуем вывод нашего факториала. Добавим одну строку кода, которая даст нам рабочую программу с выводом:

  1. # Программа находит факториал от числа
  2. # Сохраните этот файл как fact.rb
  3.  
  4. def fact(n)
  5. if n == 0
  6. 1
  7. else
  8. n * fact(n-1)
  9. end
  10. end
  11.  
  12. print fact(ARGV[0].to_i), "\n"

Здесь присутствует массив ARGV, который содержит аргументы команды, и конвертирование символов строки в целочисленную переменную (integer).

  1. % ruby fact.rb 1
  2. 1
  3. % ruby fact.rb 5
  4. 120

Давайте запустим программу с аргументом 40. Это может привести Ваш калькулятор к переполнению...

  1. % ruby fact.rb 40
  2. 815915283247897734345611269596115894272000000000

Но это работает. На самом деле, Ruby может работать с любым целым числом, с которым позволяет работать память компьютера. Итак число 400! Можем вычислить факториал и для него:

  1. % ruby fact.rb 400
  2. 64034522846623895262347970319503005850702583026002959458684
  3. 44594280239716918683143627847864746326467629435057503585681
  4. 08482981628835174352289619886468029979373416541508381624264
  5. 61942352307046244325015114448670890662773914918117331955996
  6. 44070954967134529047702032243491121079759328079510154537266
  7. 72516278778900093497637657103263503315339653498683868313393
  8. 52024373788157786791506311858702618270169819740062983025308
  9. 59129834616227230455833952075961150530223608681043329725519
  10. 48526744322324386699484224042325998055516106359423769613992
  11. 31917134063858996537970147827206606320217379472010321356624
  12. 61380907794230459736069956759583609615871512991382228657857
  13. 95493616176544804532220078258184008484364155912294542753848
  14. 03558374518022675900061399560145595206127211192918105032491
  15. 00800000000000000000000000000000000000000000000000000000000
  16. 0000000000000000000000000000000000000000000

Мы не можем проверить правильность этого вывода достаточно быстро, но он должен быть верным.

Ввод и цикл вычислений

Когда Вы вызываете Ruby без аргументов, то он считывает команды из стандартного ввода и выполняет его по окончании ввода:

  1. % ruby
  2. print "hello world\n"
  3. print "good-bye world\n"
  4. ^D
  5. hello world
  6. good-bye world

Ruby также поставляется с программой, называемой eval.rb, которая позволяет вам вводить код Ruby с клавиатуры в интерактивном цикле, показывая вам результат по мере вашего продвижения. Это будет использоваться на протяжении данного руководства.

Если Вы имеете ANSI-совместимый терминал (это будет верным, если вы запускаете программы под UNIX; под DOS Вам потребуется установить ANSI.SYS или ANSI.COM (на момент перевода эти утилиты не понадобилось устанавливать)), Вам понадобиться использовать следующую программу eval.rb , которая добавит  визуальный помощник отступов, отчёты об ошибках и подсветку синтаксиса. Или же, поищите поддиректорию sample в поставке Ruby для non-ANSI версии, которая работает в любом терминале. Ниже представлена короткая сессия eval.rb:

  1. % ruby eval.rb
  2. ruby> print "Hello, world.\n"
  3. Hello, world.
  4. nil
  5. ruby> exit

hello world предоставляется выводом print. Следующая строка, в данном случае nil , сообщает о последнем полученном значении; Ruby не различает операторы и выражения, поэтому результат куска кода в основном означает тоже самое, что и результат выполнения функции. Здесь nil означает, что print не возвращает какого либо значения. Заметьте, что мы можем выйти из цикла интерпретатора сообщив ему exit, хотя Ctrl + D также сработает.

На протяжении этого руководства, "ruby>" помечает ввод для нашей полезной маленькой программы eval.rb.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь