rubín | |
---|---|
Jazyková třída | objektově orientovaný programovací jazyk |
Objevil se v | 1995 [2] |
Autor | Matsumoto, Yukihiro |
Přípona souboru | .rbnebo.rbw |
Uvolnění | |
Typový systém | přísný , dynamický ( kachna ) |
Hlavní implementace | Ruby MRI , JRuby , Rubinius |
Byl ovlivněn | Ada , Dylan , Perl [3] , Python [3] , Smalltalk , C++ , Clu , Eiffel , Lisp , Basic , Lua a Emacs [4] |
ovlivnil | Raku , Groovy |
Licence | Licence Ruby [d] ,GNU GPL 2[5]alicence BSD 2-klauzule [6] |
webová stránka | ruby-lang.org _ |
OS | Microsoft Windows [7] , GNU/Linux [7] , BSD [7] a macOS [7] |
Mediální soubory na Wikimedia Commons |
Ruby ( anglicky ruby - ruby , vyslovováno ['ru:bɪ] - ruby ) je dynamický , reflexivní , interpretovaný programovací jazyk na vysoké úrovni [8] [9] . Jazyk má implementaci multithreadingu nezávislou na operačním systému , silné dynamické psaní , garbage collector a mnoho dalších funkcí . Z hlediska syntaxe se blíží Perlu a Eiffelovi , z hlediska objektově orientovaného přístupu - Smalltalku . Také některé funkce jazyka jsou převzaty z Pythonu , Lispu , Dylana a Clu .
Implementace jazykového tlumočníka mezi platformami je zcela zdarma [10] .
Tvůrce Ruby, Yukihiro Matsumoto (Matz) se zajímal o programovací jazyky ještě jako student, ale myšlenka na vývoj nového jazyka přišla později. Ruby se začal vyvíjet 23. února 1993 a uveden do provozu v roce 1995.
Název je inspirován jazykem Perl, jehož mnoho syntaxe a sémantiky je vypůjčeno v Ruby: English. perla - "perla", rubín - "rubín".
Jednou z Matsumotových inspirací pro vývoj Ruby byl sci-fi román Babylon 17 , založený na Sapir-Whorfově hypotéze [11] .
Cílem návrhu bylo vytvořit "skutečně objektově orientovaný ", snadno vyvíjetelný, interpretovaný programovací jazyk . Z dopisu autora [12] :
Ruby se narodila 24. února 1993. Ten den jsem mluvil s kolegou o možnosti objektově orientovaného skriptovacího jazyka . Znal jsem Perl (Perl4, ne Perl5), ale nelíbil se mi - měl v sobě (a stále má) jistý nádech jazyka hraček. A objektově orientovaný interpretovaný jazyk se zdál slibný. V té době jsem znal Python. Ale nelíbilo se mi to, protože jsem to nepovažoval za skutečný objektově orientovaný jazyk. Jeho OO vlastnosti vypadaly jako doplněk k jazyku. Jako jazykový maniak a patnáctiletý fanatik do objektově orientovaného programování jsem opravdu, opravdu chtěl skutečně objektově orientovaný a snadno použitelný jazyk. Snažil jsem se najít takový jazyk, ale žádný nebyl.
Pak jsem se rozhodl ji vytvořit. Než tlumočník začal pracovat, uplynulo několik měsíců. Do svého jazyka jsem přidal to, co jsem chtěl - iterátory , zpracování výjimek , automatické shromažďování odpadu. Poté jsem refaktoroval vlastnosti Perlu a implementoval je jako knihovnu tříd . V prosinci 1995 jsem publikoval Ruby 0,95 pro japonské diskusní skupiny. Od té doby existují webové stránky, e-mailové konference. Na e-mailových konferencích probíhají vzrušené diskuse. Nejstarší seznam nyní obsahuje 14 789 písmen.
V Japonsku se Ruby stala populární od svého prvního veřejného vydání v roce 1995, ale pouze japonská dokumentace zdržela její další přijetí. Teprve v roce 1997 se objevil popis Ruby v angličtině a v roce 1998 se otevřelo fórum ruby-talk. To znamenalo začátek růstu výtečnosti jazyka ve zbytku světa. Na počátku roku 2000 bylo vydáno několik knih v angličtině, což přispělo k rostoucí popularitě Ruby v západní Evropě a Americe. V roce 2003 byl vydán Ruby 1.8.0 a v roce 2005 se objevil webový rámec Ruby on Rails napsaný v Ruby a okamžitě si získal uznání díky snadnému vytváření typických webových aplikací na něm. Ruby v něm není pouze implementačním jazykem samotného frameworku, ale také jazykem pro popis řešení (používají se zejména HTML šablony s vloženým Ruby kódem).
Hlavním problémem jak pro Ruby obecně, tak pro Ruby on Rails byl v té době výkon: původní interpret ztratil na rychlosti jak konkurenční jazyky, tak alternativní implementace a škálovatelnost aplikace byla omezena vysokými požadavky na paměť. Vývoj jazyka v druhé polovině 20. století byl rozdělen do dvou větví: současně s podporou linie 1.8.* začal vývoj experimentální větve 1.9.*, ve které autor jazyka vycházel z tzv. zásady zachování kompatibility s předchozími verzemi a provedl významné změny v rámci přípravy na vydání Ruby 2.0. V důsledku toho se s vydáním Ruby 1.9.1 v roce 2009 a Rails 3.0 v roce 2010 situace výrazně změnila: rychlost původního interpretu se několikrát zvýšila a je téměř na stejné úrovni jako alternativní implementace pro .NET a JVM. , jazykové úpravy odstranily některé často kritizované body. Zájem o Ruby se mezi lety 2009 a 2012 více než ztrojnásobil, podle TIOBE a really.com . V Rusku se první oficiální vydání ruských překladů knih o rubínu objevila v roce 2011 a od té doby pravidelně vycházejí, což lze považovat za důkaz rostoucího zájmu o jazyk mezi rusky mluvícími odborníky.
Stabilní verze Ruby 2.0 byla vydána v únoru 2013. 24. února 2014 uplyne 21 let od oznámení programovacího jazyka Ruby. Vývojáři se rozhodli takovou událost označit vydáním patche pro Ruby 2.1, který nazvali Ruby 2.1.1 [13] . Na konci roku 2018 byla vydána verze Ruby 2.6, která implementovala kompilaci JIT .
Nyní je Ruby součástí většiny distribucí Linuxu , přichází s Mac OS X a je k dispozici uživatelům jiných operačních systémů . Jednou z hlavních aplikací spojených s Ruby je nadále Ruby on Rails, která se nadále aktivně vyvíjí, ale využití Ruby je mnohem širší - je na něm vyvíjeno velké množství aplikací pro různé účely, navíc se používá jako skriptovací jazyk pro automatizaci a přizpůsobení aplikací a psaní administrativních nástrojů, zejména v OS Linux.
Matsumoto , fanoušek objektově orientovaného programování, snil o jazyce výkonnějším než Perl a objektově orientovaném než Python. Hlavním účelem Ruby je vytvářet jednoduché a zároveň srozumitelné programy pro řešení problémů, ve kterých je čas vývoje, srozumitelnost a jednoduchost důležitější než rychlost.
Principy designu a programování Ruby jsou někdy označovány jako Ruby Way . Obecně platí, že „cesta Ruby“ nemá přesné znění, někdy se tento termín používá pro kritiku. [14] V poměrně zhuštěné podobě jsou jeho ustanovení prezentována v knihách „Programování v ruby“ od Hala Fultona [15] a „The Ruby Way“ od Hala Fultona a André Arce [16] .
Jazyk je pro lidi, ne pro počítače. Prioritou je pohodlí a minimalizace mzdových nákladů programátora při vývoji programu, čímž se programátor osvobodí od rutinní práce, kterou může počítač vykonávat rychleji a lépe. Zvláštní pozornost je věnována zejména každodenním rutinním činnostem (zpracování textu, administrativa) a jazyk je pro ně obzvláště dobře nastaven. Na rozdíl od strojově orientovaných jazyků, které fungují rychleji, je Ruby jazykem nejbližším člověku. Jakoukoli práci s počítačem dělají lidé a pro lidi a je třeba se starat především o vynaložené úsilí lidí. Jednoduché, ale ne příliš jednoduché. Zjednodušení je požehnáním, ale nemělo by překročit určité hranice, za kterými se stává samoúčelným a poškozuje konečný výsledek. Princip nejmenšího překvapení Program by se měl chovat tak, jak programátor očekává . Ale v kontextu Ruby to znamená nejmenší překvapení, ne při seznamování s jazykem, ale při jeho důkladném studiu. Sám Matsumoto tvrdí, že cílem návrhu bylo minimalizovat překvapení při programování pro něj , ale po rozšíření jazyka byl překvapen, když zjistil, že myšlení programátorů je podobné a pro mnoho z nich se shodoval princip „nejmenšího překvapení“. s jeho zásadou. Ortogonalita je důležitá, ale přirozenost je důležitější. Redundance je přijatelná, pokud je vhodná. Ruby zdědila filozofii programovacího jazyka Perl v tom smyslu, že dala programátorovi možnost dosáhnout stejného výsledku několika různými způsoby. Lidé jsou různí a pro svobodu potřebují možnost volby. "Raději poskytuji mnoho cest, pokud je to možné, ale povzbuzuji nebo navádím uživatele, aby si vybrali tu nejlepší cestu, pokud je to možné" [17] . Nebuďte otrokem produktivity. Pokud je výkon pro konkrétní případ nepřijatelně nízký, pak to vyžaduje korekci, a pokud je předem známo, že bude významný, je nutné program zpočátku navrhovat s ohledem na toto. Ale v případech, kdy účinnost není příliš kritická, je třeba dát přednost eleganci účinnosti. Nebojte se změn za běhu. Přítomnost dynamických prostředků v jazyce až po vlastní modifikaci programu za běhu poskytuje funkce, které jsou velmi užitečné pro efektivní programování. Výkonnostní hit, do kterého si pro ně musíte zajít, je ve většině případů vcelku přijatelný. Dodržujte jednoduchá a přísná pravidla, ale nedosáhněte bodu pedantství. "To, co vidíme v Ruby, není 'pedantská důslednost', ale přísné dodržování souboru jednoduchých pravidel." Pravidla a konvence (zejména konvence pojmenování přijaté v jazyce) jsou zapotřebí, aby byl program srozumitelnější. Pokud je odchylka od pravidla v konkrétním případě logická a srozumitelná, je oprávněná. "Nemusíš s tím bojovat." Ruby je to, co má být. Programátor by neměl očekávat, že se Ruby bude chovat jako jiný jazyk, na který je zvyklý. Programátor se může řídit svými vlastními nápady a zvyky ovlivněnými jinými jazyky (viz „Princip nejmenšího překvapení“ ), ale pokud se ukáže, že očekávání jsou mylná, mělo by to být jednoduše přijato a použito.Ruby je zcela objektově orientovaný jazyk. V něm jsou všechna data objekty , na rozdíl od mnoha jiných jazyků, kde existují primitivní typy . Každá funkce je metoda .
Každý konstrukt v Ruby vrací hodnotu. Například:
# Podmíněný operátor vrací hodnotu vybrané větve puts ( pokud 5 > 3 pak "One" jinak "Other" end ) #=> One # Operátor přiřazení vrací přiřazenou hodnotu puts ( var = 5 ) #=> 5Ruby používá call -by -sharing , i když se v komunitě Ruby často říká, že používá call-by-reference . Pro programátora, který je zvyklý na běžné hybridní programovací jazyky, se mohou některé dopady takového rozhodnutí zdát neočekávané. Například:
a = "abcdefg" # => "abcdefg" - proměnná a je inicializována na nový řetězec. b = a # => "abcdefg" - proměnná b získá odkaz na STEJNÝ řetězec. a [ 3 ] = 'R' # => "abcRefg" - řetězec přiřazený a je změněn. b # => "abcRefg" - změna a implicitně změněné také b, protože odkazují na JEDEN objekt. # Nicméně: x = 10 # => 10 - proměnná x je inicializována číslem 10. y = x # => 10 - proměnná y získá odkaz na stejnou hodnotu. x += 5 # => 15 - operace += vytvoří NOVÉ celé číslo 15, které se zapíše do x, y # => 10, takže změna x se neprojeví v yMechanismus přiřazení funguje stejně pro všechny objekty, na rozdíl od jazyků jako Object Pascal , kde přiřazení může znamenat buď zkopírování hodnoty, nebo zkopírování odkazu na hodnotu.
Ruby nepodporuje vícenásobnou dědičnost , ale místo toho má silný mixin mechanismus . Všechny třídy (přímo nebo prostřednictvím jiných tříd) jsou odvozeny od třídy Object, proto může jakýkoli objekt používat metody v ní definované (například , class, to_s) nil?. Procedurální styl je také podporován, ale všechny globální procedury jsou implicitně soukromými metodami Object.
Ruby je multiparadigmatický jazyk : podporuje procedurální styl (definování funkcí a proměnných mimo třídy), objektově orientovaný (vše je objekt), funkční styl ( anonymní funkce , uzávěry , vracející hodnotu všemi instrukcemi, vracející funkci poslední vypočtená hodnota). Podporuje reflexi , metaprogramování , informace o typu proměnné za běhu (viz identifikace dynamického datového typu ).
Řádkové komentáře začínají znakem #. Podporovány jsou také víceřádkové komentáře:
x = 10 # Řádkový komentář začíná znakem # a pokračuje do konce aktuálního řádku =begin Cokoli mezi =begin a =end je komentář. Oddělovače takového komentáře musí být psány od začátku řádku. = konecRuby je jazyk citlivý na velká a malá písmena, velká a malá písmena v identifikátorech se liší. Všechna klíčová slova jazyka, až na dvě výjimky, jsou psána malými písmeny.
Před verzí 2.0 tento jazyk používal mnoho 7bitových znaků ASCII . Protože je podporována verze 2.0 Unicode , soubory zdrojového kódu standardně používají kódování UTF-8 . Všechny abecední znaky Unicode mohou být použity v identifikátorech na stejné úrovni jako anglická písmena. Řetězce Unicode jsou plně podporovány.
Seznam klíčových slov Ruby:
alias a BEGIN begin break case class def definováno? udělat else elsif END end zajistit false for if in module next nil not or redo rescue retry return self super then true undef leda dokdy while výnos _Identifikátory by se měly tradičně skládat z písmen, čísel a podtržítek a začínat písmenem nebo podtržítkem. Ruby používá konvenci pojmenování:
Předpony jmen se také používají k definování rozsahu identifikátoru:
Názvy metod používají přípony k označení účelu metody:
Ruby implementuje ideologii „všechno je objekt“, to znamená, že jakákoli jednotka dat je objekt – instance určité třídy, na kterou jsou použitelné všechny syntaktické prostředky určené pro práci s objekty. V tomto smyslu jazyk neobsahuje vestavěné primitivní datové typy. Obvykle je lze považovat za typy poskytované interpretem a systémovou knihovnou, které se používají nejčastěji a pro použití nevyžadují zvláštní označení názvu třídy.
Celá čísla. Zastoupeno typy Fixnuma Bignum. První typ se používá pro čísla , která nepřesahují 2 30 v absolutní hodnotě , druhý - pro čísla větší než 2 30 . V aritmetických operacích jsou tyto číselné typy plně kompatibilní a lze je volně používat společně, je mezi nimi zajištěn transparentní převod. Typ Fixnummá omezenou bitovou šířku a používá standardní aritmetické instrukce procesoru; bitová hloubka Bignumje omezena pouze množstvím dostupné paměti RAM a operace s nimi jsou založeny na výpočetních algoritmech s neomezenou přesností. To umožňuje provádět přesné výpočty s libovolným požadovaným počtem číslic. Například ve většině programovacích jazyků je napsat přesný faktoriální program, který funguje pro argument v řádu stovek, poměrně obtížný úkol. V Ruby se to děje elementárně, protože tlumočník se stará o problémy práce s dlouhými čísly. def fact ( n ) result = 1 for i in 1 .. n do result *= i end result end puts fact ( 100 ) =begin Выведет : 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 =end Zadání desetinného čísla (kromě znaménka plus a mínus) musí začínat číslem od 1 do 9. Celé číslo, které začíná nulou, se považuje za osmičkové. Celé číslo s předponou "0x" je hexadecimální, "0b" je binární. Jiné číselné typy. Typ Float je čísla s pohyblivou řádovou čárkou reprezentovaná pevným počtem číslic. Plovoucí čísla se zapisují buď v přirozené nebo exponenciální formě. Knihovna systému mathn také poskytuje typy Rational( racionální číslo ) a Complex( komplexní číslo ). Oba tyto typy jsou automaticky převedeny na celá čísla a plovoucí s jednotkovým jmenovatelem a nulovou imaginární částí. Struny. Řetězec je měnitelné bajtové pole představující znaky kódované UTF-8. Jsou implementovány třídou String, která má velkou sadu metod, které poskytují analýzu, manipulaci s obsahem, transformaci, vyhledávání. Řetězcové literály jsou odděleny apostrofy, dvojitými uvozovkami nebo uzavřeny v konstrukci %q[…] nebo %Q[…]. Oddělovače řádků ovlivňují použití speciálních znaků v něm:Rozsahy jsou v Ruby široce používány pro vzorkování dat a smyčkování.
procedurální objekty.Program Ruby je textový soubor obsahující sekvenci instrukcí - příkazů a popisů. Když je soubor programu spuštěn k provedení, interpret postupně čte soubor a provádí instrukce. Ruby nevyžaduje, aby tělo hlavního programu bylo organizováno jako speciální programová jednotka (jako funkce main()v C), příkazy, které jej tvoří, jsou jednoduše zapsány přímo v textu programového souboru. Protože programový soubor je interpretem zpracováván sekvenčně, jakékoli funkce, metody, popisy musí předcházet jejich prvnímu použití v textu programu.
Program lze rozdělit do několika souborů. V tomto případě musí hlavní soubor programu načíst zbytek souborů pomocí příkazu requirenebo require_relative:
vyžadovat 'module1' # načíst soubor programu s názvem 'module1.rb' nebo název knihovny 'module1' vyžadovat 'pkgs/package2' # načíst soubor programu 'balíček2' z podadresáře pkgsTato instrukce vyhledá soubor se zadaným názvem a příponou '.rb' a stáhne jej. Pokud neexistuje žádný soubor zdrojového kódu se stejným názvem, interpret se pokusí načíst dynamickou knihovnu se stejným názvem (rozšíření závisí na operačním systému). Cesty pro vyhledávání souborů jsou určeny instrukcí načtení: k načtení requirepoužívá sadu adresářů určených nastavením prostředí a spouštěcími parametry interpretru a require_relativenačte soubor se zadanou cestou vzhledem k aktuálnímu souboru (tj. ve výše uvedeném příkladu , pokud je soubor obsahující instrukce pro načtení umístěn v adresáři /home/programmer/work/ruby/testproject, pak se soubor package2.rbnačte z /home/programmer/work/ruby/testproject/pkgs. Při načítání programového modulu je zpracován interpretem, to znamená, že jsou provedeny všechny jeho instrukce. Pokud je modul načten v několik souborů, pak se načte pouze jednou Ruby má metodu load, která načte i soubor zdrojového kódu nebo knihovnu, jde o poněkud odlišnou funkcionalitu a obvykle se používá k načtení binárních modulů napsaných v C.
Ruby obsahuje bohatou sadu řídicích konstrukcí; mnohé z jejich variant jsou poměrně vzácné.
Podmíněný operátor ifvypadá tradičně:
pokud x > 0 pak vloží "x je kladné číslo" elsif x < 0 , pak vloží "x je záporné číslo" jinak vloží "x je nula" konecMůže elsifexistovat libovolný počet větví, použití klíčového slova je thenpovoleno, ale není vyžadováno, větve elsifa elsemohou chybět. Kromě této „kanonické“ formy podmíněného operátoru jazyk podporuje několik dalších:
# If-not podmínka, pokud x > 3 , pak vloží x . to_s # vypíše hodnotu x, pokud NENÍ větší než tři. jinak končí "příliš mnoho na počítání" .Jako modifikátory příkazů můžete použít zkrácené formy podmíněného operátoru . Zapisují se po instrukci a jsou interpretovány jako podmínka, za které má být daná instrukce provedena. Větve elsev modifikátorech nemohou být.
vloží "x je menší než nula!" if x < 0 # Tisk proběhne pouze v případě, že x je záporné , klade "x je kladné!" if x <= 0 # Řetězec bude vytištěn, pokud je x VĚTŠÍ než nulaJako výraz můžete použít podmíněný příkaz. Jeho hodnota bude hodnota větve, která byla vybrána podle podmínky. Při tomto použití je vyžadováno klíčové slovo then. Ruby také zdědila trojitý podmíněný operátor z ?:C.
# Argument metody puts je vybrán podmíněným výrazem. vloží ( pokud x == 0 pak "null" jinak "not null" end ) # Analoga předchozí instrukce zapsaná pomocí třímístného podmíněného operátoru. klade ( x == 0 )? "null" : "není null"Operátor s více možnostmi case-whennabízí výběr z několika alternativ, z nichž každá může být specifikována jednou hodnotou, sadou hodnot nebo rozsahem:
případový měsíc , kdy 1 , 2 , 12 potom vloží "zima" # vybrat ze seznamu možností , když 3 .. 5 potom vloží "jaro" # vybrat z řady možností , když 6 .. 8 potom vloží "léto" # může nahradit potom s dvojtečkou , když 9 .. 11 # then lze vynechat, pokud je nový řádek vloží "podzim" jinak vloží "to se nestane!!!" konecAlternativy v operátoru casejsou kontrolovány postupně, je vybrána první větev, pro kterou podmínka odpovídá seznamu hodnot nebo rozsahu. Pokud není vybrána žádná z větví when, bude provedena větev else, pokud existuje.
Ruby má sedm druhů smyčkových konstrukcí. Příklad ukazuje možnosti smyčky pro procházení pole lista tisk všech jeho hodnot.
# while cyklus s předpokladem i = 0 while i < seznam . velikost do tisku " #{ seznam [ i ] } " i += 1 konec # Do smyčky ("zatím ne") s podmínkou i = 0 dokud i == seznam . velikost do tisku " #{ seznam [ i ] } " i += 1 konec # while smyčka s kontrolou konce i = 0 začít tisk " #{ seznam [ i ] } " i += 1 konec while i < seznam . velikost # Do smyčky s kontrolou konce i = 0 začít tisk " #{ seznam [ i ] } " i += 1 konec do i == seznam . velikost # Smyčka for s čítačem (i obchází daný rozsah) pro i v 0 .. seznamu . velikost - 1 do tisku " #{ seznam [ i ] } " konec # Procházet kolekcí pro x v seznamu do # x přebírá hodnoty prvků seznamu print " #{ x } " end # Nekonečná smyčka i = 0 n = seznam . velikost - 1 smyčka vytisknout " #{ seznam [ i ] } " i += 1 přerušení , pokud i > n # Konec, pokud je konec # Smyčka i = 0 n = seznam . velikost - 1 smyčka vytisknout " #{ seznam [ i ] } " i += 1 přerušení , pokud i < = n # Konec, když je porušena podmínka ukončeníRuby podporuje dynamická heterogenní pole , která automaticky mění velikost a mohou obsahovat prvky libovolného typu. Pole je instancí třídy Array, která poskytuje výkonné nástroje pro práci s uloženými daty.
# Pole lze inicializovat pomocí seznamu hodnot v hranatých závorkách. a = [ 1 , 'ahoj' , 3 . 14 , 1 , 2 , [ 4 , 5 ] * 3 ] a [ 2 ] # Obrácení podle indexu # „rozbalte“ všechna vnitřní pole, odstraňte identické prvky a . zplošťuje . uniq # => [1, 'hi', 3.14, 2, 4, 5] # najít prvek podle hodnoty a . index ( 6 ) # fail: nula a je vráceno . index ( 4 ) # => 5 # téměř všechny funkce jsou opatřeny # analogem se stejným názvem, ale končícím na "!", # což modifikuje samotný kontejner a . zplošťuje! # => [1, "ahoj", 3,14, 1, 2, 4, 5, 4, 5, 4, 5]Pro typy kontejnerů jsou k dispozici iterátory, které umožňují iterovat jejich prvky.
# Iterátor 'každý' - nad prvky seznamu kolekce . každý dělá | x | tisk " #{ x } " konec # Iterator 'times' - podle počtu prvků v kolekci n = list . velikost n . časy dělají | já | tisk " #{ seznam [ i ] } " konec # Iterátor 'až' - od původního čísla po maximum n = seznam . velikost - 1 O . až ( n ) do | já | tisk " #{ seznam [ i ] } " konec # Iterator seznam 'každý_index' . každý_index do | x | tisk " #{ seznam [ x ] } " konecVšechny třídy jsou potomky předdefinované třídy Object. Metody třídy jsou popsány v popisu třídy samotné. Proměnné s předponou @@, které se vyskytují v popisu třídy, jsou proměnné třídy (analogické ke statickým členům třídy v C++), proměnné s předponou @ jsou proměnné instance (pole třídy).
class Osoba < Objekt # třída Osoba zdědí z Object include Comparable # mix instančních metod z modulu Comparable @ proměnná # proměnná instance @@count_obj = 0 # proměnná třídy pro počítání počtu vytvořených objektů # def inicializovat ( jméno , věk ) # konstruktor (jméno, věk - parametry metody) @ jméno , @ věk = jméno , věk # vytvoření objektů @@ count_obj += 1 # zvýší počítadlo o 1 konec def <=> ( osoba ) # operátor přepsat <=> @věk <=> osoba . věk # poslední vyhodnocený výraz je vrácen z metody end def to_s # pro výstup formátovaných informací vloží " #{ @ jméno } ( #{ @ věk } )" # konstrukce #{x} ve 2 uvozovkách je v řetězci nahrazena textovou hodnotou x end def inspect # metoda použitá interpretem pro diagnostický výstup "< #{ @@count_obj } : #{ to_s } >" end attr_reader :name , :age # vytvořit metody přístupu ke čtení pro pole end # Vytvořte pole instancí třídy Person group = [ Person . nový ( "Jan" , 20 ), Osoba . nový ( "Markus" , 63 ), Osoba . new ( "Ash" , 16 ) ] # metoda inspect je automaticky volána na výstup # => [<3:John (20)>, <3:Markus (63)>, <3:Ash (16)>] # řazení a "obrácení" pole pomocí standardních metod # funguje tak, že přepíše operátor <=> puts group . řadit . reverzní # Tiskne: # Markus (63) # John (20) # Ash (16) # metoda mezi přidána implicitně při zahrnutí srovnatelné skupiny [ 0 ]. mezi? ( skupina [ 2 ] , skupina [ 1 ] ) # => pravdaJedna třída v Ruby může být deklarována ve více zdrojových souborech. Díky tomu je možné například přidávat nové metody do již existující třídy.
Ruby podporuje pouze jednu dědičnost . Kromě toho existuje mechanismus mixin a možnost deklarovat moduly, které vám umožňují implementovat většinu funkcí vícenásobné dědičnosti.
Ruby má mnoho originálních řešení, která se zřídka nebo vůbec nenacházejí v běžných programovacích jazycích. Metody můžete přidat nejen do libovolných tříd, ale také do libovolných objektů. Například můžete do nějakého řetězce přidat libovolnou metodu.
# vše od znaku # po konec řádku - komentář # = je operátor přiřazení, # znaky v """ jsou řetězce, se kterými lze manipulovat pomocí jazyka str = "Dobrý den" # proměnná str je zde vytvořen, typu String # def je klíčové slovo pro deklarace funkcí def str .bye # str . určuje, kdo je vlastníkem metody (výchozí objekt) # bye je název metody, volitelně následovaný volitelným seznamem parametrů funkce v závorkách "Ahoj!" # poslední vypočítaná hodnota je vrácena z metody (zde řetězec) end # téměř všechny instrukce Ruby končí klíčovým slovem end # puts je metoda, # str.bye je volání metody bye str objekt # hodnota získaná z metody bye je předána metodě puts, # která zobrazí informace puts str.bye # => Nashledanou !Tento příklad také ukazuje, jak lze singleton použít v Ruby . V tomto příkladu je singleton str.
Jazyk má 2 ekvivalentní způsoby zápisu bloků kódu :
{ říká "Ahoj, světe!" } do klade "Ahoj, světe!" konecKorutiny se používají s většinou vestavěných metod:
soubor . otevřít ( 'soubor.txt' , 'w' ) { | soubor | # otevřete soubor "file.txt" pro zápis ("w" - write) souboru . vloží 'Napsal nějaký text.' } # Návrh eliminuje nejistotu s uzavřením souboru: zavře zde pro jakýkoli výsledekNásledující příklad ukazuje použití korutin a iterátorů pro práci s poli, což ukazuje stručnost zápisu v Ruby mnoha poměrně složitých akcí (náhodně vyberte ze sekvence čtverců čísel od "0" do "10" a vytiskněte spolu s indexy):
# Ke spuštění vyžaduje Ruby 1.9 ( 0 .. 10 ) . sbírat { | v | v ** 2 } . vyberte { rand ( 2 ) . nula? } . mapa . with_index { |* v | v }Výjimky jsou vyvolány pomocí konstrukce raise(nebo ), volitelně faillze přidat text se zprávou, typ výjimky a informace o zásobníku volání :
raise ArgumentError , "Neplatný argument" , caller # caller je metoda, která vrací aktuální zásobník prováděníVýjimky se řeší pomocí rescue. Volitelně můžete určit typ výjimky, která má být zpracována (ve výchozím nastavení jsou zpracovány všechny) a informace, které mají být načteny. Můžete také přidat bloky else(běží, pokud nebyly žádné výjimky) a ensure(přesto běží).
begin # ... rescue RuntimeError => e # zpracovat konkrétní typ chyby vloží e # vytisknout chybovou zprávu záchrana # můžete napsat záchranu => e získat objekt výjimky # zpracovat všechny výjimky jinak # bude fungovat, pokud existuje nebyly žádné výjimky , které zajistí # bude fungovat tak jako tak endExistuje několik implementací pro Ruby: oficiální interpret napsaný v C , JRuby je implementace pro Javu , interpret pro platformu .NET IronRuby , Rubinius je napsán hlavně v Ruby a je založen na myšlenkách Smalltalk - 80 VM [18] , MagLev je další založený na Smalltalku vyvinutém Gemstone [19] , Blue Ruby je implementace Ruby pro virtuální stroj ABAP [20] , MacRuby je implementace pro Mac OS se zaměřením na maximální integraci s možnostmi operačního systému [21] , mruby je implementace pro vložení do programů [22] .
Oficiální interpret byl portován na většinu platforem, včetně Unix , Microsoft Windows (včetně Windows CE ), DOS , Mac OS X , OS/2 , Amiga , BeOS , Syllable , Acorn RISC OS a další. Pro Windows existuje specializovaný RubyInstaller a je možné jej provozovat pod Cygwin pro větší kompatibilitu s Unixem [23] .
Oficiální verze interpretu Ruby je dodávána s příkazovým shellem Ruby ( Interactive Ruby Shell ). Spouští se příkazem irbv okně terminálu ( rozhraní příkazového řádku ) a umožňuje velmi rychle otestovat programový kód (řádek po řádku):
$ irb irb ( hlavní ): 001 : 0 > "Dobrý den, světe" => "Dobrý den, světe" irb ( hlavní ): 002 : 0 > 2 ** 256 # ** - operátor umocnění => 1157920892373161954235709495423570949539090819846599081Program irbvypíše výsledek každého řádku za znaky =>. Ve výše uvedených příkladech je pro názornost použita anotace - výsledky programových řádků se zapisují do komentářů za =>. Simulaci irblze spustit přímo v prohlížeči .
Od verze 1.8.2-15 je distribuční balíček One-Click Installer pro Windows dodáván s obslužným programem, fxrikterý obsahuje systém nápovědy ( ri) a interaktivní interpret ( irb).
Do mnoha editorů jsou přidány základní možnosti úprav ( Emacs , Bred , vim , jEdit , nano , SciTE , Kate atd.), zde jsou uvedena pouze IDE , která poskytují bohatou sadu funkcí.
název | Licence | Platformy | Odkaz |
---|---|---|---|
ActiveState Komodo IDE | Proprietární | Linux, Mac OS X, Solaris, Windows | [jeden] |
Arachno Ruby IDE | Proprietární | Windows 2000/XP, Linux | [2] Archivováno 25. prosince 2019 na Wayback Machine |
Aptana ( Rails + RDT ) | GPL , APL+ CPL | Jáva | [3] |
EasyEclipse pro Ruby a Rails | Win 2000/XP, Linux, Mac OS X | [čtyři] | |
Eclipse + RDT | EPL + CPL | Jáva | [5] |
Embarcadero TurboRuby | Proprietární | Windows, OSX, Linux | [6] |
jízda zdarma | Licence Ruby | Windows, OSX, POSIX | [7] |
IntelliJ IDEA + Ruby Plugin | Proprietární (na IDEA ), Apache 2.0 (na samotném pluginu) | Java, Ruby | Ruby plugin |
KDevelop | GNU GPL | linux | [osm] |
Komodo Edit | Proprietární | Windows, Mac, Linux | [9] |
Vývoj Mondrian Ruby IDE byl ukončen, stará verze je k dispozici | MIT | Ruby (+ sada nástrojů FOX ) | [deset] |
NetBeans IDE (verze 6.9.1 a starší) | CDDL | Jáva | [11] Archivováno 1. srpna 2008 na Wayback Machine |
RDE | Licence Ruby | Okna | [12] (nedostupný odkaz) |
rubín v oceli | Proprietární | Visual Studio 2005 | [13] |
RubyMine | Proprietární (na základě IDEA ) | Jáva | [čtrnáct] |
Visual Studio ( implementace IronRuby ) | Proprietární | Okna | [patnáct] |
Xcode 3.1 | Proprietární | Mac OS X 10.5 | [16] |
Kromě výkonných funkcí zabudovaných do jazyka přichází Ruby s velkou standardní knihovnou . Především jsou to knihovny pro práci s různými síťovými protokoly na straně serveru i klienta , nástroje pro práci s různými formáty prezentace dat ( XML , XSLT , YAML , PDF , RSS , CSV , WSDL ). Kromě ladicích nástrojů zabudovaných do jazyka přichází Ruby s knihovnami pro testování jednotek , protokolování a profilování . K dispozici jsou také knihovny pro práci s archivy , daty, kódováním , maticemi , nástroje pro správu systému, distribuované výpočty, podpora multithreadingu atd.
Základní vestavěné třídy Rubynázev | Popis | Verze [24] |
---|---|---|
Vrchol hierarchie třídy Ruby. | 1,0 | |
|
Dynamické pole pro ukládání libovolných objektů, indexováno od 0. | 1,0 |
Objekty ukládají kontext provádění nějaké části kódu (hodnotu proměnných, metod atd.). Může být později použit k provádění výpočtů v tomto kontextu. | 1.2 | |
Objekt ukládá návratovou adresu a kontext provádění, což vám umožňuje skočit do bodu vytvoření odkudkoli v programu (tzv. nelokální skok). | 1.4 | |
Obal kolem ukazatele C , používaný hlavně při psaní rozšíření. | 1,0 | |
Reprezentace adresářů souborového systému. Poskytuje možnost prohlížet adresáře a jejich atributy. | 1,0 | |
Základní třída všech výjimek (tvoří vrchol hierarchie více než 30 výjimek). | 1,0 | |
|
Globální proměnná falseje jedinou instancí této třídy a představuje booleovskou false v booleovských výrazech. | 1,0 |
Sběr párů klíč-hodnota; pořadí průchodu je nezávislé na pořadí vložení. | 1,0 | |
Základní I/O schopnosti. | 1,0 | |
Třída pro přístup k souborům. | 1,0 | |
|
Výsledek použití regulárního výrazu. Obvykle se nepoužívá přímo, ale prostřednictvím speciálních proměnných $&, $', $`, $1atd $2. | 1,0 |
Metoda spojená s konkrétním objektem (nikoli třídou). Lze použít k volání této metody bez přítomnosti objektu. | 1.2 | |
Třída modulu. | 1,0 | |
|
třída tříd; třídy v Ruby jsou objekty a Class je třída těchto objektů (metatřída). | 1,0 |
|
Jedinou instancí třídy je proměnná nil. nilPředstavují pouze falselži v programech. Jakýkoli jiný objekt je pravdivý. | 1,0 |
Abstraktní třída čísel. | 1,0 | |
Abstraktní třída celých čísel. Může být považován za nekonečný bitový řetězec pro bitové operace. | 1,0 | |
Celá čísla omezená pouze velikostí paměti. Převede se na Fixnumautomaticky, pokud do nich lze hodnotu umístit, a naopak. (Před verzí 2.4) | 1,0 | |
Celá čísla, která se vejdou do strojového slova (32 bitů na většině strojů). Pokud je výsledek operace mimo rozsah, automaticky se převede na Bignum. (Před verzí 2.4) | 1,0 | |
Čísla s pohyblivou řádovou čárkou. | 1,0 | |
|
Blok kódu s přidruženým kontextem ( uzávěr ), který lze opakovaně spustit v jiných kontextech. | 1,0 |
|
Interval: Sada hodnot s počátečním a koncovým prvkem. | 1,0 |
Regulární výraz. | 1,0 | |
Řetězec bajtů libovolné délky. | 1,0 | |
|
Poskytuje snadný způsob, jak svázat atributy dohromady bez přímého psaní kódu třídy; generuje speciální třídy obsahující mnoho proměnných a přístupových metod. | 1,0 |
Představuje název a je vytvořen pomocí :name. Všechny objekty s daným názvem vytvořené v programu jsou odkazy na jeden objekt. | 1.6 | |
Zapouzdřuje informace o vláknu, včetně hlavního vlákna skriptu Ruby. | 1,0 | |
Poskytuje způsob, jak spravovat skupinu vláken. Vlákno může patřit pouze jednomu ThreadGroup. Přidáním vlákna do nové skupiny se vlákno odebere z jakékoli předchozí. | 1.6 | |
Datum a čas. | 1,0 | |
|
Globální proměnná trueje jedinou proměnnou třídy a představuje logickou pravdu v booleovských výrazech. | 1,0 |
Metoda, která není spojena s konkrétním objektem. Lze svázat s objektem a vyvolat jako Method. | 1.6 |
Jazyk Ruby poskytuje jednoduchý a pohodlný mechanismus pro rozšíření jazyka o knihovny napsané v C , což usnadňuje vývoj dalších knihoven [25] [26] .
Pro jednotný přístup k databázím byla vyvinuta knihovna Ruby DBI (podporuje SQLite , Oracle Database , ODBC , MySQL , DB2 , MS SQL , InterBase , ADO atd.). Existují také knihovny specifické pro databáze, které podporují operace specifické pro databázi. Existuje několik knihoven pro implementaci ORM , jako je ActiveRecord, Mongoid, DataMapper nebo Sequel.
Mezi grafické knihovny patří FxRuby (rozhraní s grafickou knihovnou FOX ), grafický vývojový balíček wxRuby (rozhraní pro C ++ multiplatformní balíček wxWidgets ), QtRuby/Korundum (vazba na Qt a KDE ), grafické knihovny pro práci s Tk [27] a Gtk . Implementována byla také knihovna pro práci s OpenGL , která umožňuje programování trojrozměrné grafiky .
Win32utils - umožňuje přístup ke specifickým funkcím Win32 API .
Rmagick je knihovna pro manipulaci s obrázky, která podporuje více než 90 formátů (založených na ImageMagick a GraphicsMagick ).
Knihovna Ruport (Ruby reporty) je navržena pro snadnou implementaci reportů a vytváření grafů na základě dat z databáze nebo přímo z textových souborů CSV . Výsledky lze navíc uložit ve formátech PDF , HTML , CSV a TXT.
RuTils je ruský textový procesor v Ruby. Umožňuje implementovat částku slovy a volbu číslice. Například 231.propisju(2) => "dvě stě třicet jedna" nebo 341.propisju_items(1, "kufr", "kufr", "kufry") => "tři sta čtyřicet jedna kufr". Stejně tak překlad do transliterace a práce s daty.
Systém správy balíčků RubyGems je navržen tak, aby spravoval knihovny a programy Ruby jako samostatné balíčky .
Existuje celosvětové úložiště softwaru Ruby RAA (Ruby Application Archive) . Úložiště k září 2007 obsahuje více než jeden a půl tisíce projektů. Velké množství softwaru napsaného v Ruby hostí projekt RubyForge , který byl vytvořen speciálně pro tento účel. RubyForge je uzavřena 15. května 2014, zatímco archiv programu zůstane dostupný ke stažení.
Většina rozšíření je distribuována pod svobodnými licencemi ( LGPL , Ruby licence) a lze je použít v jakémkoli projektu téměř bez omezení.
Systém RDoc je určen pro automatickou extrakci dokumentace ze zdrojových kódů a programů Ruby a její další zpracování. Je to de facto standard pro přípravu dokumentace pro software napsaný v Ruby.
Pro přístup k dokumentaci Ruby z příkazového řádku Unixu byl vyvinut program ri. S jeho pomocí můžete získat informace o modulech, třídách a metodách Ruby.
Jedním z nejčastěji kritizovaných aspektů Ruby je výkon. Původní interpret v prvních verzích vykazoval v testech rychlost práce třikrát až pětkrát nižší než v té době aktivně používané interpretované jazyky (PHP, JavaScript, Python). V současné době toto tvrzení do značné míry ztratilo svou relevanci: výkon moderních verzí tlumočníků (původních i alternativních) je přibližně stejného řádu (přesné odhady se liší od jednoho testu k druhému) s tlumočenými jazyky, které jsou si svým účelem blízké. a obecně je poměrně vysoká, takže v typických úlohách se tlumočník nestává „ úzkým hrdlem “. Zavedení JIT kompilace ve verzi 2.6 je v souladu s celkovým výkonnostním trendem tlumočníků.
Ruby je výrazně pomalejší než staticky typované imperativní jazyky, které se kompilují do objektového kódu jako C , Pascal nebo Go , ale tato nevýhoda je společná pro většinu dynamických jazyků. V případech, kdy se výkon jednotlivých fragmentů programu stane kritickým, jediným způsobem, jak toho dosáhnout, je napsat tyto fragmenty v rychlejších jazycích (obvykle v C ).
Kritici také poukazují na nedostatky v současných implementacích Ruby a v samotném procesu vývoje jazyka a systému.
Ruby používá NASA , NOAA (National Oceanic and Atmospheric Administration), Motorola a další velké organizace [28] . Následující programy používají Ruby jako skriptovací jazyk k rozšíření možností programu nebo jsou v něm napsány (částečně nebo zcela).
Níže uvedený seznam uvádí pouze hlavní aktualizace [31] .
Název verze | datum vydání | Poznámky |
---|---|---|
0,06 | 7. ledna 1994 | První verze uvedená v Changelogs |
1,0-961225 | 25. prosince 1996 | Tato verze bezprostředně následovala verzi 0.99.4-961224 vydanou o den dříve. Číslo po 1.0 je datum vydání verze. Na další rok vycházely nové verze řady 1.0 (až 1.0-971225). |
1.1 alfa0 | 13. srpna 1997 | Alfa verze byly vydány do 7. října 1997 (1.1 alpha9) |
1.1b0 | 4. prosince 1997 | Další verze po 1.1 alpha9. 27. února 1998 byla vydána verze 1.1b9, poté až do poloviny roku 1998 existovala experimentální vydání s označením jako 1.1b9_31 (verze 1.1b9_31 byla vydána, ale není uvedena v dokumentaci). |
1.1c0 | 17. července 1998 | Tato verze následovala verzi 1.1b9_31. Úpravy této verze byly vydány do 26. listopadu 1998 (1.1c9). |
1.1d0 (před 1.2) | 16. prosince 1998 | Tato verze následovala verzi 1.1c9. 22. prosince 1998 vyšla experimentální verze 1.1d1, která tuto řadu završila. |
1.2 (stabilní) | 25. prosince 1998 | Další úpravy této verze byly vydány až do verze 1.2.5, vydané 13. dubna 1999. 21. června 1999 byla vydána verze 1.2.6, oznámená jako finální verze 1.2 (1.2 final). 15. července 1999 vyšla přebalená verze 1.2.6. |
1.3 (vývoj) | 24. prosince 1998 | Samostatná větev modifikací, vyvinutá nezávisle na řadě 1.2 (podobně jako linuxové jádro). První verze byla oznámena jako vývojová verze a následovala verzi 1.1d1. Následovalo mnoho přechodných úprav: ruby-1.3.1-990215 - ruby-1.3.4-990625, po kterých opustili datum v čísle a vydali 1.3.5 - 1.4 alfa (15. července 1999), 1.3.6 - 1.4 alfa (28. července 1999), 1.3.7 - 1.4 beta (6. srpna 1999). |
1.4.0 (stabilní) | 13. srpna 1999 | Tato verze se objevila několik dní po vydání 1.3.7 - 1.4 beta. Následně byly uvolněny nové modifikace až do verze 1.4.6, která vyšla 16. srpna 2000. |
1.5.0 (vývoj) | 20. listopadu 1999 | Tato řada byla určena výhradně k testování různých novinek ve vývoji. Úpravy této řady jsou dostupné výhradně v úložišti projektu a sestavy této verze tedy nebyly nahrány na oficiální server. |
1.6.0 (stabilní) | 19. září 2000 | V budoucnu byly vydány modifikace této verze až do verze 1.6.8 (24. prosince 2002). 21. září 2005 byla vydána oprava pro verzi 1.6.8. |
1.7.0 (vývoj) | 24. února 2001 | Tato řada byla určena výhradně k testování různých novinek ve vývoji. Úpravy této řady jsou dostupné výhradně v úložišti projektu a sestavy této verze tedy nebyly nahrány na oficiální server. |
1.8.0 (stabilní) | 4. srpna 2003 | Následovalo velké množství úprav, které stále vycházejí (1. ledna 2011), například 24. prosince 2010 vyšla meziverze 1.8.7-p330. |
1.9.0 (vývoj) | 25. prosince 2007 | Zpočátku experimentální větev, vytvořená za účelem testování řady novinek v praxi. |
1.9.3 (stabilní) | 31. října 2011 | Rozdíly oproti 1.9.2 jsou značné. |
2.0.0 (stabilní) | 24. února 2013 | |
2.1.0 (stabilní) | 25. prosince 2013 | |
2.2.0 (stabilní) | 25. prosince 2014 | Podpora pro Unicode 7.0, přidáno garbage collection pro objekty typu Symbol. |
2.3.0 (stabilní) | 25. prosince 2015 | Přidán nový operátor "&." pro snazší manipulaci s nulovými hodnotami při přístupu k objektům. Bylo implementováno nové experimentální pragma zmrazených řetězců, které umožňuje zmrazit stav řetězcových literálů ve zdrojových textech. |
2.4.0 (stabilní) | 25. prosince 2016 | Sjednocení Fixnum a Bignum na celé číslo. Podpora pro změnu velkých a malých písmen znaků Unicode pro řetězec. Vylepšení hashovací tabulky (st_table). Interaktivní relace binding.irb. Přidána metoda Regexp#match?. Optimalizace pole#max, pole#min. |
2.5.0 (stabilní) | 25. prosince 2017 | V do/end blocích je nyní legální používat záchranné, jinak a zajišťovací úseky přímo.
Metoda yield_self je definována pro provádění operace výnosu na bloku v jeho kontextu. Na rozdíl od tap metoda vrací výsledek provádění bloku. Podpora pro měření pokrytí testovacích kódů větví a metod. Přidány nové metody Hash#slice a Hash#transform_keys. Povoleno automatické načítání knihovny pp.rb bez nutnosti specifikovat 'require "pp"' v kódu. Změněn výstup trasovacích a chybových zpráv na opačné pořadí (na začátku jsou volání, počínaje starými a konče čerstvými a na konci se zobrazí chybová zpráva). [32] |
2.6.0 (stabilní) | 25. prosince 2018 | Přidána podpora pro kompilaci JIT od Vladimira Makarova;
Přidán nový modul RubyVM::AbstractSyntaxTree ; Nový alias v jádře, Kernel#pak alias na Kernel#yield_self; Přidány nekonečné intervaly (1..); |
2.7.0 (stabilní) | 25. prosince 2019 | Experimentální podpora pro porovnávání vzorů
Přidán kompaktní sběrač odpadu GC.compact Možnost používat výchozí očíslované názvy proměnných pro parametry bloku. Experimentální podpora pro rozsahy bez koncové hodnoty. |
3.0.0 (stabilní) | 25. prosince 2020 | Přidána možnost statické analýzy |
V elektronické podobě:
V elektronické podobě:
rubín | |
---|---|
Lidé | |
IDE |
|
Implementace |
|
Aplikace |
|
Knihovny a rámce |
|
Serverový software | |
jiný |
|
|
Programovací jazyky | |
---|---|
|