Знаймо

Додати знання

приховати рекламу

Цей текст може містити помилки.

Ruby


Ruby-logo-R.svg

План:


Введення

Ruby ( англ. Ruby ['ɹu: bɪ] - "Рубін") - динамічний, рефлективний, інтерпретується високорівнева мова програмування для швидкого і зручного [1] [2] об'єктно-орієнтованого програмування. Мова має незалежною від операційної системи реалізацією багатопоточності, суворої динамічною типізацією, складальником сміття і багатьма іншими можливостями. Ruby близький за особливостями синтаксису до мов Perl і Eiffel, по об'єктно-орієнтованого підходу - до Smalltalk. Також деякі риси мови взяті з Python, Лісп, Dylan і CLU.

Кроссплатформенная реалізація інтерпретатора мови є повністю вільною. [3]


1. Історія створення та розвитку

Творець Ruby - Юкіхіро Мацумото (Matz) - цікавився мовами програмування, ще будучи студентом, але ідея про розробку нової мови з'явилася пізніше. Ruby почав розроблятися 24 лютого 1993 і вийшов у світ в 1995.

Назва навіяна мовою Perl, багато особливостей синтаксису і семантики з якого запозичені в Ruby: англ. pearl - "Перлина", ruby - "Рубін".

Метою розробки було створення "справжнього об'єктно-орієнтованого ", легкого в розробці, інтерпретується мови програмування. З листа автора [4] :

Ruby народився 23 лютого 1993 року. У той день я розмовляв зі своїм колегою про можливість існування об'єктно-орієнтованого сценарного мови. Я знав Perl (Perl4, а не Perl5), але він мені не подобався - був у ньому якийсь присмак іграшкового мови (та й понині є). А об'єктно-орієнтована мова, що інтерпретується здавався багатообіцяючим. У той час я знав Python. Але він мені не подобався тому, що я не вважав його справжнім об'єктно-орієнтованою мовою. Його OO властивості здавалися надбудовою над мовою. Мені, як мовною маніякові і фанату об'єктно-орієнтованого програмування з п'ятнадцятирічним стажем, дуже, дуже хотілося, щоб був істинно об'єктно-орієнтована, простий у використанні мову. Я намагався знайти таку мову, але його не було.

Тоді я вирішив його створити. Минуло кілька місяців, перш ніж Лари запрацював. Я додав у мій язик те, що мені хотілося - ітератори, обробку винятків, автоматичну збірку сміття. Потім я переорганізувати властивості Perl і реалізував їх як бібліотеку класів. У грудні 1995 я опублікував Ruby 0.95 в японських новинних групах. З тих пір з'явилися сайти, списки розсилок. У списках розсилок йдуть запеклі обговорення. Найстаріший список зараз містить 14 789 листів.

У Японії Ruby став популярним з моменту появи першої загальнодоступної версії в 1995, однак наявність документації тільки на японській мові стримувало його подальше розповсюдження. Лише в 1997 з'явився опис Ruby англійською мовою, а в 1998 році відкрився форум "ruby-talk". Це поклало початок росту популярності мови в іншому світі. Видано кілька книг на різних мовах, у тому числі на російською. Зараз Ruby входить в більшість дистрибутивів ОС Linux, доступний користувачам інших операційних систем.


2. Хронологія виходу версій

У списку нижче перераховані лише найбільш великі поновлення [5].

Назва версії Дата виходу Примітки
0.06 7 січня 1994 Перша версія, зазначена в Changelog'ах
1.0-961225 25 грудня 1996 Дана версія слідувала відразу за версією 0.99.4-961224, випущеної напередодні. Номер після числа 1.0 - дата випуску версії. Нові версії лінійки 1.0 виходили ще рік (до 1.0-971225).
1.1 alpha0 13 серпня 1997 Альфа-версії виходили аж до 7 жовтня 1997 (1.1 alpha9)
1.1b0 4 грудня 1997 Наступна версія після 1.1 alpha9. 27 лютого 1998 вийшла версія 1.1b9, потім аж до середини 1998 виходили експериментальні випуски з позначенням виду 1.1b9_31 (версія 1.1b9_31 була випущена, але в документації не відзначена).
1.1c0 17 липня 1998 Дана версія слідувала за версією 1.1b9_31. Модифікації цієї версії виходили аж до 26 листопада 1998 (1.1c9).
1.1d0 (pre1.2) 16 грудня 1998 Дана версія слідувала за версією 1.1c9. 22 грудня 1998 була випущена експериментальна версія 1.1d1, що завершила цю лінійку.
1.2 (stable) 25 грудня 1998 Надалі виходили модифікації даної версії аж до версії 1.2.5, випущеної 13 квітня 1999. 21 червня 1999 була випущена версія 1.2.6, оголошена як фінальна версія 1.2 (1.2 final). 15 липня 1999 вийшла переупакованої (repacked) версія 1.2.6.
1.3 (development) 24 грудня 1998 Окрема гілка модифікацій, що розробляється незалежно від лінійки 1.2 (за аналогією з ядром ОС Linux). Перша версія була оголошена як версія для розробки (development version) і йшла за версією 1.1d1. Надалі було безліч проміжних модифікацій: ruby-1.3.1-990215 - ruby-1.3.4-990625, після чого від зазначення дати в номері відмовилися і випустили 1.3.5 - 1.4 alpha (15 липня 1999), 1.3.6 - 1.4 alpha (28 липня 1999), 1.3.7 - 1.4 beta (6 серпня 1999).
1.4.0 (stable) 13 серпня 1999 Дана версія з'явилася через кілька днів після виходу 1.3.7 - 1.4 beta. Надалі виходили нові модифікації аж до версії 1.4.6, вийшов через 16 серпня 2000 року.
1.5.0 (development) 20 листопада 1999 Дана лінійка призначалася виключно для перевірки різних нововведень при розробці. Модифікації даної лінійки доступні виключно в репозиторії проекту і, відповідно, складання даної версії на офіційний сервер не викладалися.
1.6.0 (stable) 19 вересня 2000 В подальшому випускалися модифікації цієї версії аж до версії 1.6.8 (24 грудня 2002). 21 вересня 2005 був випущений патч для версії 1.6.8.
1.7.0 (development) 24 лютого 2001 Дана лінійка призначалася виключно для перевірки різних нововведень при розробці. Модифікації даної лінійки доступні виключно в репозиторії проекту і, відповідно, складання даної версії на офіційний сервер не викладалися.
1.8.0 (stable) 4 серпня 2003 Надалі було велике число модифікацій, які виходять до цих пір (1 січня 2011 року), наприклад, проміжна версія 1.8.7-p330 вийшла 24 грудня 2010 року.
1.9.0 (development) 25 грудня 2007 Остання гілка на даний момент (1 січня 2011 року). Відповідно, модифікації також виходять до цих пір.

3. Філософія

Мацумото, фанат об'єктно-орієнтованого програмування, мріяв про мову, більш потужному, ніж Perl, і більш об'єктно-орієнтованому, ніж Python. Основне призначення Ruby - створення простих і в той же час зрозумілих програм, де важлива не швидкість роботи програми, а малий час розробки, зрозумілість і простота синтаксису.

Мова слід принципом "найменшої несподіванки" : програма повинна вести себе так, як очікує програміст. Проте в контексті Ruby це означає найменше подив не при знайомстві з мовою, а при його грунтовному вивченні. Сам Мацумото стверджує, що метою розробки була мінімізація несподіванок при програмуванні для нього, але після поширення мови він з подивом дізнався, що мислення програмістів схоже і для багатьох їхніх принцип "найменшою несподіванки" співпав з його принципом.

Ruby також успадкував ідеологію мови програмування Perl в частині надання програмісту можливостей досягнення одного і того ж результату кількома різними способами. Люди різні, і їм для свободи необхідна можливість вибирати. "Я вважаю за краще забезпечити багато шляхів, якщо це можливо, але заохочувати або вести користувачів, щоб вибрати кращий шлях, якщо це можливо". [6] Втім, даний підхід призводить до того, що людина, що аналізує чужий код, повинен знати все "шляху". Навряд чи він погодиться, що виконується "принцип найменшої несподіванки", коли один і той же метод реалізований трьома різними способами.

Однією з основних цілей розробки було звільнення програмістів від рутинної роботи, яку комп'ютер може виконувати швидше і якісніше. Особливу увагу, зокрема, приділялася буденним рутинним заняттям (обробка текстів, адміністрування), і для них мову налаштований особливо добре.

На противагу машинно-орієнтованим мовам, які працюють швидше, метою цієї розробки була мова, найбільш близький до людини. Будь-яка робота з комп'ютером виконується людьми і для людей, і необхідно піклуватися в першу чергу про витрачаються зусиллях людей. Мова дозволяє максимально швидко і просто для людини виконати завдання, хоча, можливо, це і зажадає додаткового часу роботи комп'ютера.

Принципи програмування та дизайну мови іноді виділяються в термін "Шлях Ruby" ( англ. Ruby Way ). Хел Фултон виділяє [7] такі принципи, як "просто, але не дуже просто", "принцип найменшого подиву", вторинність швидкості роботи програми, динамічність, прості суворі правила, виконання яких не доходить до педантизму, потреба створювати корисні і красиві програми як причина програмування. В цілому вони не мають точного формулювання і іноді цей термін використовується для критики. [8]


4. Семантика

Ruby - повністю об'єктно-орієнтована мова. У ньому всі дані є об'єктами, на відміну від багатьох інших мов, де існують примітивні типи. Кожна функція - метод.

Змінні Ruby передаються по посиланню. Для програміста, звичного до поширених гібридним мовам програмування, деякі ефекти такого рішення можуть здатися несподіваними. Наприклад:

 a =  "Abcdefg"  b = ab  # => "Abcdefg"  a  [  3  ]  =  'R'  b  # => "AbcRefg" 

тобто при зміні значення змінної a, неявно змінилось і значення b, оскільки вони містять посилання на один об'єкт. Тобто механізм привласнення діє однаково для всіх об'єктів, на відміну від мов типу C, Object Pascal, де присвоювання може означати як копіювання значення, так і копіювання посилання на значення.

Ruby не підтримує множинне спадкування, але замість нього є потужний механізм домішок. Всі класи (безпосередньо або через інші класи) виведені з класу Object , Отже, будь-який об'єкт може використовувати визначені в ньому методи (наприклад, class , to_s , nil? ). Процедурний стиль також підтримується, але всі глобальні процедури неявно є закритими методами класу Object.

Ruby є мультіпарадігменним мовою : він підтримує процедурний стиль (визначення функцій і змінних поза класів), об'єктно-орієнтована (усі - об'єкт), функціональний ( анонімні функції, замикання, повернення значення всіма інструкціями, повернення функцією останнього обчисленого значення). Він підтримує відображення, метапрограмування, інформацію про типах змінних на стадії виконання (див. динамічна ідентифікація типу даних).


5. Метапрограмування на Ruby

5.1. Argument Array

Перетворення списку аргументів методу в масив

 def  my_method  (  *  args  )  args.  map  {  |  arg  |  arg.  reverse  }  end  my_method  (  'Abc'  ,  'Xyz'  ,  '123 '  )  # => ["Cba", "zyx", "321"] 

5.2. Around Alias

Використання псевдоімен (aliases). Виклик старої версії методу з перевизначеного методу.

 class  String  alias  : Old_reverse  : Reverse  def  reverse  "X # {old_reverse} x"  end  end  "Abc"  .  reverse  # => "Xcbax" 

5.3. Blank Slate

Видалення методу з об'єкта, щоб зробити його Ghost Method

 class  C  def  method_missing  (  name,  *  args  )  "A Ghost Method"  end  end  obj = C.  new  obj.  to_s  # => "# "  class  C instance_methods.  each  do  |  m  |  undef_method m  unless  m.  to_s  = ~  /  method_missing  |  respond_to?  |  ^ __  /  end  end  obj.  to_s  # => "A Ghost Method" 

5.4. Class Extension

Визначення нових методів класу додаванням методів (mixins) з іншого модуля. Як холдера нових методів використовується eigenclass цільового класу. Особливий випадок Object Extention.

 class  C;  end  module  M  def  my_method  'A class method'  end  end  class  < .  my_method  # => "A class method" 

5.5. Class Extension Mixin

Використання Hook методів для розширення класу.

 module  M  def  self  .  included  (  base  )  base.  extend  (  ClassMethods  )  end  module  ClassMethods  def  my_method  'A class method'  end  end  end  class  C  include  M  end  C.  my_method  # => "A class method" 

5.6. Class Instance Variable

Збереження стану класу в екземплярність змінних об'єкта Class.

 class  C  @ My_class_instance_variable  =  "Some value"  def  self  .  class_attribute  @ My_class_instance_variable  end  end  C.  class_attribute  # => "Some value" 

5.7. Class Macro

Виклик методів класу у визначенні класу.

 class  C  end  class  <<  C  def  my_macro  (  arg  )  "My_macro (# {arg}) called"  end  end  class  C my_macro  : X  # => "My_macro (x) called"  end 

5.8. Clean Room

Використання спеціального об'єкта, для безпечного виконання зовнішнього блоку коду. Використовується для створення DSL.

 class  CleanRoom  def  a_useful_method  (  x  )  x  *  2  end  end  CleanRoom.  new  .  instance_eval  {  a_useful_method  (  3  )  }  # => 6 

5.9. Code Processor

Виконання рядки коду із зовнішнього джерела.

 File  .  readlines  (  "A_file_containing_lines_of_ruby.txt"  )  .  each  do  |  line  |  puts  "# {Line.chomp} ==> # {eval (line)}"  end  #>> 1 + 1 ==> 2  #>> 3 * 2 ==> 6  #>> Math.log10 (100) ==> 2.0 

5.10. Context Probe

Виконання блоку коду з доступом до внутрішнього стану об'єкта.

 class  C  def  initialize  @ X  =  "A private instance variable"  end  end  obj = C.  new  obj.  instance_eval  {  @ X  }  # => "Приватна мінлива екземпляра" 

5.11. Deferred Evaluation

Збереження блоку коду разом з контекстом в proc або lambda для виконання в майбутньому.

 class  C  def  store  (  &  block  )  @ My_code_capsule  = Block  end  def  execute  @ My_code_capsule  .  call  end  end  obj = C.  new  obj.  store  {  $ X  =  1  }  $ X  =  0  obj.  execute  $ X  # => 1 

5.12. Dynamic Dispatch

Прийняття рішення, про те який саме метод буде викликаний в рантайме.

 method_to_call =  : Reverse  obj =  "Abc"  obj.  send  (  method_to_call  )  # => "Cba" 

5.13. Dynamic Method

Визначення нового методу на етапі виконання.

 class  C  end  C.  class_eval  do  define_method  : My_method  do  "A dynamic method"  end  end  obj = C.  new  obj.  my_method  # => "A dynamic method" 

5.14. Dynamic Proxy

Додавання додаткового функціоналу (cross-cutting concerns) в методи класу.

 class  MyDynamicProxy  def  initialize  (  target  )  @ Target  = Target  end  def  method_missing  (  name,  *  args,  &  block  )  "Result: # {@ target.send (name, * args, & block)}"  end  end  obj = MyDynamicProxy.  new  (  "A string"  )  obj.  reverse  # => "Result: gnirts a" 

5.15. Flat Scope

Використання замикань для шарінга змінних між двома областями видимості.

 class  C  def  an_attribute  @ Attr  end  end  obj = C.  new  a_variable =  100  # Flat scope:  obj.  instance_eval  do  @ Attr  = A_variable  end  obj.  an_attribute  # => 100 

5.16. Ghost Method

Повернення результату для методу, який не знайдений у визначенні класу.

 class  C  def  method_missing  (  name,  *  args  )  name.  to_s  .  reverse  end  end  obj = C.  new  obj.  my_ghost_method  # => "Dohtem_tsohg_ym" 

5.17. Hook Method

Перехоплення подій об'єктної моделі ruby, наприклад, розширення класу, додавання методу, і т. д.

 $ INHERITORS  =  [  ]  class  C  def  self  .  inherited  (  subclass  )  $ INHERITORS  <<  subclass  end  end  class  D  <  C  end  class  E  <  C  end  class  F  <  E  end  $ INHERITORS  # => [D, E, F] 

5.18. Kernel Method

Визначення методу в модулі Kernel робить його доступним скрізь.

 module  Kernel  def  a_method  "A kernel method"  end  end  a_method  # => "A kernel method" 

5.19. Lazy Instance Variable

Ледача ініціалізація змінної.

 class  C  def  attribute  @ Attribute  =  @ Attribute  | |  "Some value"  # Або  # @ Attribute | | = "some value"  end  end  obj = C.  new  obj.  attribute  # => "Some value" 

5.20. Mimic Method

Метод як інша конструкція мови, наприклад, метод як клас.

 def  BaseClass  (  name  )  name ==  "String"  ?  String  :  Object  end  class  C  <<  BaseClass  "String"  # Метод, який виглядає, як клас  attr_accessor  : An_attribute  # Метод, який виглядає, як keyword  end  obj = C.  new  obj.  an_attribute  =  1  # Метод, який виглядає, як атрибут 

5.21. Monkeypatch

Зміна функціоналу існуючого класу.

 "Abc"  .  reverse  # => "Cba"  class  String  def  reverse  "Override"  end  end  "Abc"  .  reverse  # => "Override" 

5.22. Named Arguments

Упаковка аргументів методу в хеш масив.

 def  my_method  (  args  )  args  [  : Arg2  ]  end  my_method  (  : Arg1  =>  "A"  ,  : Arg2  =>  "B"  ,  : Arg3  =>  "C"  )  # => "B" 

5.23. Nil Guard

Заміна nil на альтернативний об'єкт (без перевірки на nil)

 x =  nil  y = x  | |  "A value"  # => "A value" 

5.24. Object Extension

Визначення сінгелтон-методів у конкретному об'єкті, шляхом підмішування (mixing) методів з іншого модуля.

 obj =  Object  .  new  module  M  def  my_method  'A singleton method'  end  end  class  < .  my_method  # => "A singleton method" 

5.25. Open Class

Додавання нових методів у существуюх клас.

 class  String  def  my_string_method  "My method"  end  end  "Abc"  .  my_string_method  # => "My method" 

5.26. Pattern Dispatch

Вибір методу, для виклику, грунтуючись на його імені.

 $ X  =  0  class  C  def  my_first_method  $ X  +  =  1  end  def  my_second_method  $ X  +  =  2  end  end  obj = C.  new  obj.  methods  .  each  do  |  m  |  obj.  send  (  m  )  if  m.  to_s  = ~  /  ^ My_  /  end  $ X  # => 3 

5.27. Sandbox

Виконання небезпечного коду в безпечному оточенні.

 def  sandbox  (  &  amp; code  )  proc  {  $ SAFE  =  2  yield  }  .  call  end  begin  sandbox  {  File  .  delete  'A_file'  }  rescue  Exception  =>  ex ex  # => #   end 

5.28. Scope Gate

Ізолювання змінних областю видимості. У ruby ​​немає вкладених областей видимості!

 a =  1  defined  ? a  # => "Local-variable"  module  MyModule b =  1  defined  ? a  # => Nil  defined  ? b  # => "Local-variable"  end  defined  ? a  # => "Local-variable"  defined  ? b  # => Nil 

5.29. Singleton Method

Визначення cінглотон-методу в конкретному об'єкті.

 obj =  "Abc"  class  < .  my_singleton_method  # => "X" 

або

 obj =  "Abc"  def  obj.  my_singleton_method  "X"  end  obj.  my_singleton_method  # => "X" 

5.30. Symbol To Proc

Перетворення символу в proc з наступним викликом. Корисна техніка при роботі з масивами.

 [  1  ,  2  ,  3  ,  4  ]  .  map  (  &  : Even?  )  # => [False, true, false, true] 

6. Можливості Ruby

  • Має лаконічний і простий синтаксис, частково розроблений під впливом Ада, Eiffel і Python.
  • Дозволяє обробляти виключення в стилі Java і Python.
  • Дозволяє перевизначати оператори, які насправді є методами.
  • Повністю об'єктно-орієнтована мова програмування. Всі дані в Ruby є об'єктами в розумінні Smalltalk. Єдине виключення - керуючі конструкції, які в Ruby на відміну від Smalltalk не є об'єктами. Наприклад, число "1" - це екземпляр класу Fixnum . Також підтримується додавання методів в клас і навіть в конкретний екземпляр під час виконання програми.
  • Не підтримує множинне спадкування, але замість нього може використовуватися концепція " домішок ", заснована в даній мові на механізмі модулів.
  • Містить автоматичний складальник сміття. Він працює для всіх об'єктів Ruby, в тому числі для зовнішніх бібліотек.
  • Створювати розширення для Ruby на Сі дуже просто частково через збирача сміття, частково через нескладного і зручного API.
  • Підтримує замикання з повною прив'язкою до змінних.
  • Підтримує блоки коду (код полягає в {... } або do... end). Блоки можуть використовуватися в методах або перетворюватися в замикання.
  • Цілі змінні в Ruby автоматично конвертуються між типами Fixnum (32-розрядні) і Bignum (Більше 32 розрядів) залежно від їх значення, що дозволяє виробляти цілочисельні математичні розрахунки зі як завгодно великою точністю.
  • Не вимагає попереднього оголошення змінних, але для інтерпретатора бажано, щоб змінним присвоювалося пусте значення nil (тоді інтерпретатор знає, що ідентифікатор позначає змінну, а не ім'я методу). Мова використовує прості угоди для позначення області видимості. Приклад: просто var - локальна змінна, @var - змінна екземпляра (член або поле об'єкта класу), @@var - змінна класу, $var - глобальна змінна.
  • В Ruby безпосередньо в мові реалізовано багато шаблони проектування, так, наприклад, " одинак ​​"(singleton) може бути (хоча і не зобов'язаний) реалізований додаванням необхідних методів до одного конкретного об'єкту (див. нижче).
  • Може динамічно завантажувати розширення, якщо це дозволяє операційна система.
  • Має незалежну від ОС підтримку невитісняючої багатопоточності.
  • Перенесено на безліч платформ. Він розроблявся на Linux, але працює на багатьох версіях Unix, DOS, Microsoft Windows (зокрема, Win32), Mac OS, BeOS, OS / 2 і т. д.

7. Приклади

В Ruby є чимало оригінальних рішень, рідко або взагалі не зустрічаються в поширених мовах програмування. Можна додавати методи не тільки в будь-класи, а й у будь-які об'єкти. Наприклад, ви можете додати до деякої рядку довільний метод.

 # Все від символу # і до кінця рядка - коментар  # = Є оператором присвоювання,  # Символи в "" "- рядок, якою можна маніпулювати засобами мови  str =  "Привіт"  # Тут створюється мінлива str, типу String  # Def - ключове слово для оголошення функції  def  str.  bye  # Str. вказує, кому належить метод (за замовчуванням Object)  # Bye - ім'я методу, за ним може слідувати необов'язковий, укладений в  # Круглі дужки список параметрів функції  "Поки!"  # З методу повертається останнє обчислене значення (тут - рядок)  end  # Ключовим словом end закінчуються практично всі інструкції Ruby  # Puts - метод,  # Str.bye - звернення до методу bye об'єкта str  # Значення, отримане з методу bye передається методу puts  # Який виводить на екран інформацію  puts  str.  bye  # => Поки! 

Цей приклад також демонструє, як в Ruby можна використовувати Сінглтон. У цьому прикладі Сінглтоном є об'єкт str.

Будь-яка конструкція в Ruby повертає значення. Наприклад:

 # Конструкція if обчислює вираз після нього, і, якщо воно істинне,  # Повертає результат вираження між then і else, інакше між else і end  puts  (  if  5  >  3  then  "Одне"  else  "Інше"  end  )  # => Одне  # Відбувається привласнення значення змінної var, і операція присвоювання  # Повертає значення змінної var, яка виводиться на екран  puts  (  var =  5  )  # => 5 

7.1. Контейнери

Робота з масивами - одна із сильних сторін Ruby. Вони автоматично змінюють розмір, можуть містити будь-які елементи, і мова надає потужні засоби для їх обробки.

 # Створюємо масив  a =  [  1  ,  'Hi'  ,  3.14  ,  1  ,  2  ,  [  4  ,  5  ]  *  3  ]  # => [1, "hi", 3.14, 1, 2, [4, 5, 4, 5, 4, 5]]  # Звернення за індексом  a  [  2  ]  # => 3.14  # "Розгортаємо" всі внутрішні масиви, видаляємо однакові елементи  a.  flatten  .  uniq  # => [1, 'hi', 3.14, 2, 4, 5]  # Намагаємося знайти індекс елемента зі значенням 4  a.  index  (  4  )  # => Nil  # Попередня спроба знайти елемент невдала - всі попередні функції  # Повертають копії, але Ruby майже для всіх функцій надається  # Аналог з тією ж назвою, але закінчується на "!",  # Який модифікує контейнер  a.  flatten  !  # => [1, "hi", 3.14, 1, 2, 4, 5, 4, 5, 4, 5]  a.  index  (  4  )  # => 5 

7.2. Процедурні об'єкти і ітератори

У мові є 2 еквівалентних способу запису блоків коду :

 {  puts  "Hello, World!"  }  do  puts  "Hello, World!"  end 

Сопрограмми застосовуються з більшістю вбудованих методів:

 File  .  open  (  'File.txt'  ,  'W'  )  {  |  file  |  # Відкриття файлу "file.txt" для запису ("w" - write)  file.  puts  'Wrote some text.'  }  # Конструкція усуває невизначеність із закриттям файлу: закривається тут при будь-якому результаті 

Наступний приклад показує використання сопрограмм і ітераторів для роботи з масивами, який показує стислість запису на Ruby багатьох досить складних дій (випадково вибираємо з послідовності квадратів чисел від "0" до "10" і роздруковуємо разом з індексами):

 # Для роботи потрібно ruby ​​1.9  (  0  ..  10  )  .  collect  {  |  v  |  v  **  2  }  .  select  {  rand  (  2  )  .  zero  ?  }  .  map  .  with_index  {  | *  v  |  v  } 

7.3. Класи, домішки, методи, перевантаження операторів

Наступний приклад визначає клас з ім'ям Person, призначений для зберігання інформації про ім'я та вік деякої персони.

 class  Person  # Оголошення класу починається з ключового слова class, за яким  # Іде ім'я  include  Comparable  # Підмішується до класу  # І додає методи <, <=, ==,> =,> і between?  # З використанням ніжеопределенного  # В класі <=>  #  @ @ Count_obj =  0  # Мінлива класу для підрахунку числа створених об'єктів  #  # Конструктор для створення об'єктів за допомогою new  def  initialize  (  name, age  )  # Name, age - параметри методу  # Назва змінних об'єкта починається з @  @ Name  ,  @ Age  = Name, age  # Створюємо об'єкти і збільшуємо лічильник на 1  @ @ Count_obj  +  =  1  end  def  <=>  (  person  )  # Перевизначення оператора <=>  # (Це дає можливість використовувати метод sort)  @ Age  <=>  person.  age  # З методу повертається останнє обчислене вираз,  end  def  to_s  # Для форматованого виведення інформації puts  "# {@ Name} (# {@ age})"  # Конструкція # {x} в 2-х лапках заміщається в Ruby значенням x  end  def  inspect  # Схожий на to_s, але використовується для діагностичного висновку  "<#{@Count_obj}: # {to_s}> "  end  # Приклад метапрограмування: додає методи для доступу до  # Змінним об'єкта  attr_reader  : Name  ,  : Age  end  # Створюємо масив об'єктів  group =  [  Person.  new  (  "John"  ,  20  )  , Person.  new  (  "Markus"  ,  63  )  , Person.  new  (  "Ash"  ,  16  )  ]  # => [<3: John (20)>, <3: Markus (63)>, <3: Ash (16)>]  # Тут при роботі з irb автоматично викликається метод inspect  # Викликаємо методи масиву сортування і розгортання його в зворотному порядку  puts  group.  sort  .  reverse  # Друкує:  # Markus (63)  # John (20)  # Ash (16)  # Звертаємося до функції, яка була додана  # Автоматично (використовуючи <=>) при включенні Comparable  group  [  0  ]  .  between  ?  (  group  [  2  ]  , Group  [  1  ]  )  # => True 

7.4. Винятки

Винятки збуджуються за допомогою конструкції raise (або fail), опціонально можуть бути додані текст з повідомленням, тип винятку і інформація про стеку викликів :

 raise  ArgumentError  ,  "Невірний аргумент"  ,  caller  # Caller - метод, який повертає поточний стек виконання 

Обробляються виключення з використанням конструкції rescue. Опціонально можна вказати тип оброблюваного виключення (за замовчуванням обробляються всі) та отримання інформації. Також можна додавати блоки else (виконується якщо винятку були відсутні) і ensure (виконується в будь-якому випадку).

 begin  # ...  rescue  RuntimeError  =>  e  # Обробляємо конкретний тип помилок  puts  e  # Надрукуємо повідомлення про помилку  rescue  # Можна писати rescue => e щоб отримати об'єкт виключення  # Обробляємо всі виключення  else  # Спрацює, якщо винятків не було  ensure  # Спрацює в будь-якому випадку  end 

8. Реалізація

Для Ruby існують декілька реалізацій: офіційний Лари, написаний на Сі, JRuby - реалізація для Java, інтерпретатор для платформи . NET IronRuby, Rubinius - написана в основному на Ruby і базується на ідеях Smalltalk -80 VM [9], MagLev - інша базується на Smalltalk розробка від компанії Gemstone [10], Blue Ruby - реалізація Ruby для віртуальної машини ABAP [11], MacRuby - реалізація для Mac OS з фокусом на максимальну інтеграцію з можливостями операційної системи [12].

Офіційний Лари портовано під більшість платформ, включаючи Unix, Microsoft Windows (у тому числі Windows CE), DOS, Mac OS X, OS / 2, Amiga, BeOS, Syllable, Acorn RISC OS і інші.

Для Windows існує RubyInstaller for Windows і є можливість запуску під Cygwin для більшої сумісності з Unix [13]


8.1. Інтерактивна Ruby

З офіційною версією інтерпретатора Ruby поставляється інтерактивний інтерпретатор мови. Запускається командою irb в консолі, він дозволяє тестувати текст програми дуже швидко (підрядник):

 $ Irb irb (main): 001:0> "Hello, World" => "Hello, World" irb (main): 002:0> 2 ** 256 # ** - оператор піднесення до степеня => 115792089237316195423570985008687907853269984665640564039457584007913129639936 

Програма irb виводить результат кожного рядка після символів =>. У наведених вище прикладах для наочності застосовується анотування - результати рядків програми записуються в коментарях після =>. Імітацію irb можна запустити безпосередньо в браузері.

У постачанні дистрибутивів One-Click Installer для Windows, починаючи з версії 1.8.2-15, поставляється утиліта fxri, яка включає в себе довідкову систему (ri) та інтерактивний інтерпретатор (irb).


9. Підтримка IDE

Базові можливості редагування додаються до багатьох редакторам ( Emacs, vim, jEdit, nano, SciTE тощо), тут перераховані тільки IDE, тобто мають великий набір функцій.

Назва Ліцензія Платформи Посилання
ActiveState Komodo IDE Пропріетарна Linux, Mac OS X, Solaris, Windows http://activestate.com/Products/komodo_ide/
Arachno Ruby IDE Пропріетарна Win 2000/XP, Linux http://www.ruby-ide.com
Aptana ( RadRails + RDT) CPL Java http://www.aptana.com/
Eclipse + RDT CPL Java RDT Homepage
Embarcadero TurboRuby Пропріетарна Windows, OS X, Linux http://www.embarcadero.com/products/turboruby
FreeRIDE Ruby License Windows, OS X, POSIX http://rubyforge.org/projects/freeride/
IntelliJ IDEA + Ruby plugin Пропріетарна (на IDEA), Apache 2.0 (на сам plugin) Java, JRuby Ruby plugin
KDevelop GNU GPL Linux http://kdevelop.org/
Komodo IDE 6 Пропріетарна Windows, Mac, Linux http://www.activestate.com/komodo-ide
Mondrian Ruby IDE MIT Ruby (+ FOX toolkit) http://www.mondrian-ide.com/
NetBeans IDE (версія 6.9.1 і більш ранні) CDDL Java http://www.netbeans.org/features/ruby/
RDE Ruby License Windows http://homepage2.nifty.com/sakazuki/rde_en/
Ruby in steel Пропріетарна Visual Studio 2005 http://www.sapphiresteel.com/
RubyMine Пропріетарна (на базі IDEA) Java http://www.jetbrains.com/ruby
Visual Studio (реалізація IronRuby) Пропріетарна Windows http://www.microsoft.com/visualstudio/en-us/products
Xcode 3.1 Пропріетарна Mac OS X 10.5 http://developer.apple.com/tools/xcode/

10. Бібліотеки

10.1. Стандартна бібліотека

Крім потужних можливостей, вбудованих в мову, Ruby поставляється з великою стандартної бібліотекою. Це, насамперед, бібліотеки для роботи з різними мережевими протоколами на стороні сервера і клієнта, засоби для роботи з різними форматами представлення даних ( XML, XSLT, YAML, PDF, RSS, CSV, WSDL). Крім вбудованих в мову засобів налагодження, з Ruby поставляються бібліотеки для юніт-тестування, профілювання. Також є бібліотеки для роботи з архівами, датами, кодуваннями, матрицями, засоби для системного адміністрування, розподілених обчислень, підтримки багатопоточності і т. д.

Основні вбудовані класи Ruby
Назва Опис Версія [14]
Вершина ієрархії класів Ruby. 1.0
Динамічний масив для зберігання довільних об'єктів, індексований з 0. 1.0
Об'єкти зберігають контекст виконання деякої ділянки коду (значення змінних, методів і т. д.). Може пізніше використовуватися для виконання обчислень у цьому контексті. 1.2
Об'єкт зберігає адресу повернення і контекст виконання, дозволяючи виконати перехід в точку створення з будь-якого місця програми (т. зв. Нелокальний перехід). 1.4
Обгортка навколо покажчика Сі, використовується в основному при написанні розширень. 1.0
Директорія файлової системи. Надає можливості для перегляду директорій та їх атрибутів. 1.0
Базовий клас всіх винятків (утворює вершину ієрархії більш ніж 30 винятків). 1.0
Глобальна змінна false є єдиною змінною цього класу і представляє логічну брехня в булевских виразах. 1.0
Колекція пар ключ-значення; порядок обходу не залежить від порядку вставки. 1.0
Базові можливості вводу-виводу. 1.0
Клас для доступу до файлів. 1.0
Результат застосування регулярного виразу. Зазвичай використовується не безпосередньо, а через спеціальні змінні $&, $', $`, $1, $2 і т. д. 1.0
Метод, асоційований з конкретним об'єктом (не з класом). Може використовуватися для виклику цього методу без наявності об'єкта. 1.2
Клас модулів. 1.0
Клас класів; класи в Ruby є об'єктами, а Class є класом цих об'єктів (метаклассом). 1.0
Єдиним екземпляром класу є змінна nil. Тільки nil і false представляють брехня в програмах. Будь-який інший об'єкт являє собою істину. 1.0
Абстрактний клас чисел. 1.0
Абстрактний клас цілих чисел. Може трактуватися як нескінченна бітова рядок для бітових операцій. 1.0
Цілі числа обмежені тільки кількістю пам'яті. Конвертується в Fixnum автоматично, якщо значення може бути розміщено в них і навпаки. 1.0
Цілі числа, які можуть бути розміщені в машинному слові (32 біта для більшості машин). Якщо результат операції виходить за рамки, автоматично перетвориться в Bignum. 1.0
Числа з плаваючою комою. 1.0
Блок коду із пов'язаною з ним контекстом ( замикання), який може виконуватися неодноразово в інших контекстах. 1.0
Інтервал: безліч значень, заданих з початковим і кінцевим елементами. 1.0
Регулярний вираз. 1.0
Рядок байт довільної довжини. 1.0
Надає простий спосіб зв'язування атрибутів разом без написання коду класу безпосередньо; генерує спеціальні класи, містять безліч змінних і методів доступу. 1.0
Представляє ім'я і створюється при використанні синтаксису :name. Всі об'єкти з такою назвою створені в програмі - посилання на один об'єкт. 1.6
Інкапсулює інформацію про потік, включаючи основний потік скрипта Ruby. 1.0
Надає спосіб управління групою потоків. Потік може належати тільки до однієї ThreadGroup. Додавання потоку до нової групи видаляє його з будь-якої попередньої. 1.6
Дата і час. 1.0
Глобальна змінна true є єдиною змінною класу і представляє логічну істину в булевских виразах. 1.0
Метод, не пов'язаний з конкретним об'єктом. Може прив'язуватися до об'єкта і викликати як Method. 1.6

10.2. Розширення

У мові Ruby реалізований простий і зручний механізм для розширення мови за допомогою бібліотек, написаних на Сі, що дозволяє легко розробляти додаткові бібліотеки. [15] [16]

Для уніфікованого доступу до баз даних розроблена бібліотека Ruby DBI (підтримує SQLite, Oracle, ODBC, MySQL, DB2, MS SQL, InterBase, ADO та ін.) Також існують бібліотеки для конкретних баз даних, що підтримують специфічні для них операції. Для реалізації ORM існують декілька бібліотек, такі як ActiveRecord, DataMapper або Sequel.

З графічних бібліотек слід відзначити FxRuby - інтерфейс до графічної бібліотеки FOX, графічний пакет розробника wxRuby (інтерфейс до кроссплатформенной пакету wxWidgets на C + +), QtRuby / Korundum - прив'язка до Qt і KDE відповідно, графічні бібліотеки для роботи з Tk і Gtk. Також реалізована бібліотека для роботи з OpenGL, що дозволяє програмувати тривимірну графіку.

Win32utils - дозволяє звертатися до специфічних можливостей Win32 API.

Rmagick - бібліотека для роботи із зображеннями, що підтримує більше 90 форматів (заснована на ImageMagick і GraphicsMagick).

Бібліотека Ruport (Ruby reports) призначена для легкої реалізації звітів і створення діаграм на основі даних з БД або прямо з текстових файлів CSV. Причому результати можна зберігати у форматах PDF, HTML, CSV і TXT.

RuTils - обробник російського тексту на Ruby. Дозволяє реалізувати суму прописом і вибір числівника. Наприклад, 231.propisju (2) => "двісті тридцять одна" або 341.propisju_items (1, "чемодан", "валізи", "валіз") => "триста сорок один чемодан". А також переведення в трансліт і роботу з датами.

Для управління бібліотеками і програмами Ruby у вигляді самодостатніх пакетів призначена система управління пакетами RubyGems ( англ. gems, gem - Дорогоцінний камінь).

Існує всесвітній репозиторий програмного забезпечення Ruby RAA (Ruby Application Archive) [1]. Репозиторій станом на вересень 2007 налічує понад півтори тисячі проектів. Велика кількість програмного забезпечення, написаного на Ruby, користуються хостингом проекту RubyForge [2], створеного спеціально з цією метою.

FreeRIDE - IDE для Ruby, реалізована з використанням бібліотеки FxRuby.

Більшість розширень розповсюджуються під вільними ліцензіями ( LGPL, ліцензія Ruby) і можуть бути використані в будь-якому проекті практично без обмежень.


11. Документація

Система RDoc призначена для автоматичного вилучення документації з вихідних кодів та програм на Ruby та її подальшої обробки. Є стандартом де-факто для підготовки документації з програмного забезпечення, написаному на Ruby.

Для доступу до документації Ruby з командного рядка Unix розроблена програма ri. З її допомогою можна отримати інформацію про модулях, класах і методах Ruby. Онлайн -документація доступна на сайті http://www.ruby-doc.org.


12. Використання

Ruby використовується в NASA, NOAA (національна адміністрація з океану та атмосфері), Motorola і інших великих організаціях. [17] Наступні програми використовують Ruby як скриптова мова для розширення можливостей програми або написані на ньому (частково або повністю).


Примітки

  1. Е. А. Роганов, Основи мови Ruby - www.sctc.msiu.ru/files/2010-2011/11/2/0/lecture, 12 жовтня 2010
  2. [Брюс Тейт, Практичне використання Rails: Частина 4. Стратегії тестування в Ruby on Rails - www.ibm.com/developerworks/ru/library/wa-rails4/index.html?ca=drs-ru, 01.07.2008
  3. LICENSE - www.ruby-lang.org/en/LICENSE.txt (Англ.) (TXT). - Ліцензія Ruby. архіві - www.webcitation.org/617jSCkBK з першоджерела 22 серпня 2011. Ліцензія Ruby - переклад
  4. Лист Юкіхіро Мацумото в розсилку ruby-Talk Ruby-talk: 00382 - blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/382 від 4 червня 1999 року. Є переклад всього листи на російську - www.msiu.ru/ ~ radigin/docs/ruby-faq/node7.html
  5. Інформація була взята з супровідних текстових файлів Changelog. Документи різних версій розрізняються між собою, часом враховуючи лише версії, пов'язані з лінійці, супроводжуваної даним документом.
  6. Інтерв'ю Юкіхіро Мацумото - www.artima.com / intv / ruby.html (Англ.)
  7. Хел Фултон. Програмування на мові Ruby - 2-е вид. - М .: ДМК Пресс, 2007. - С. 24-27.
  8. 5 things I hate about Ruby - www.wonko.com/article/371 (Англ.) (25 жовтня 2005). Фотогалерея - www.webcitation.org/617jShFr6 з першоджерела 22 серпня 2011.
  9. Rubinius Home - rubini.us /
  10. MagLev / măg-lĕv / - maglev.gemstone.com /
  11. Blue Ruby - New Exploratory Research
  12. MacRuby - www.macruby.org/
  13. Cygwin and Ruby Windows - www.hugoestrada.net/node/164
  14. Через слабку документованості Ruby в ранніх версіях інформація отримана безпосередньо з вихідного ( helium.ruby-lang.org/ftp: / / ruby - www.sunsite.org.uk/sites/helium.ruby-lang.org/ftp://ruby/ (Англ.) . ). Зазначені тільки стабільні (парні) версії.
  15. Thomas, Dave. Extending Ruby - www.rubycentral.com / book / ext_ruby.html (Англ.) . Programming Ruby - The Pragmatic Programmer's Guide. Addison Wesley Longman, Inc. (Недоступна посилання)
  16. Rooney, Garrett. Extending Ruby with C - www.onlamp.com/pub/a/onlamp/2004/11/18/extending_ruby.html (Англ.) . O'Reilly Media ( 18 листопада 2004). Фотогалерея - www.webcitation.org/617jTUgKe з першоджерела 22 серпня 2011.
  17. Хел Фултон. Програмування на мові Ruby - 2-е вид. - М .: ДМК Пресс, 2007. - С. 21.

Цей текст може містити помилки.

Схожі роботи | скачати

Схожі роботи:
Ruby on Rails
© Усі права захищені
написати до нас