Hlavní navigace

Ruby v příkladech (7) - Ruby symbolické a nepovedené

Pavel Sýkora 27. 10. 2005

V posledním dílu seriálu si povíme něco o symbolech v Ruby a po šesti dílech vychvalování poodhalíme také stinné stránky Ruby.

Symboly v Ruby

V předchozích dílech jsem občas symboly použil, ale nevysvětlil. Konstanty typu Symbol začínají dvojtečkou, např:

:toto_je_symbol 

Dokumentace třídySymbol říká, že je to reprezentace jmen a vnitřních řetězců interpretu jazyka Ruby. Pokud vás ale ani toto vysvětlení neuspokojilo, můžete symboly považovat za speciální druh řetězců, se kterými je povoleno provádět jen velmi omezený počet operací – vlastně jen porovnání na shodu a převod na „normální“ řetězec. Oproti normálním řetězcům je zde ale ještě jeden podstatný rozdíl. Pokud použijeme tutéž („normální“) řetězcovou konstantu několikrát, vždy se bude jednat i jinou instanci (jiný objekt). Naproti tomu tatáž konstanta typu Symbol je vždy i tatáž instance (tentýž objekt, jedináček) v kontextu celého interpretu jazyka Ruby.

Symboly se hojně používají například jako klíče v heších (viz například spouštění WEBricku). S velmi hojným použitím se setkáte i ve frameworku pro webové aplikace Ruby on Rails, o kterém si na Rootu přečtete v nejbližší době.

Co se v Ruby nepovedlo

Jako každý jazyk má Ruby své stránky světlejší i stinné. Ačkoliv, dle mého názoru, světlé stránky značně převažují, je vždy užitečné vědět i o těch stinných.

Unicode

Velkým zklamáním je zjištění, že Ruby verze 1.8.x nepodporuje žádné lokály, kódové stránky, Unicode – prostě nic takového. Vzhledem k tomu, že autorem Ruby je Japonec a že v Japonsku je Ruby velmi oblíbeným a rozšířeným jazykem, je absence Unicode téměř šokující. Metody jako řazení, převod znaků z malých na velké a zpět apod. fungují jen na písmena anglické abecedy. Prostě jen ASCII.

Autor slibuje podporu Unicode ve verzi 2.0, ale v současné verzi 1.9 (má to být jakési preview verze 2.0) jsem nic z Unicode zatím nenašel. Pokud některé knihovny Unicode potřebují (např. REXML pro zpracování XML), řeší si to většinou samy. Protože se Ruby nebrání mít v řetězcích cokoliv, lze používat např. i UTF-8 (to bylo ostatně použito i u většiny aplikací v minulých dílech). Dokonce pokud použijete při spuštění Ruby volby -Ku -rjcode, budou vám pro kódování UTF-8 správně fungovat i některé metody třídy String pro (například size/ length).

Vlákna

Ruby nepoužívá nativní vlákna operačního systému. To má sice i výhodu, že na všech OS je v Ruby práce s vlákny stejná a lze paralelizovat program i v těch OS, kde nejsou vlákna vůbec podporována. Nicméně většina rozumných operačních systémů dnes vlákna nativně podporuje. Přístup použitý v Ruby však může zapříčinit, že např. déle trvající (blokující) vstupně/výstupní operace zablokuje všechna vlákna bez ohledu na to, zda mají s onou V/V operací něco společného. Pochybuji také, že vlákna v Ruby bez podpory nativních vláken mohou běžet skutečně paralelně na víceprocesorových systémech (ale nezkoušel jsem to a ani nijak důkladněji nezkoumal).

Lokální proměnné v bloku

Ruby má ne zcela logické chování, pokud se v bloku vyskytuje lokální proměnná. Mějme např. kód:

def funkce
  a = 0
  [1, 2, 3].each do |i|
    a = i
    b = i
  end
  ...
end 

Po vykonání kódu bude mít v místě tří teček proměnná a hodnotu 3, zatímco proměnná b nebude existovat. Pokud však lokální proměnná vznikne v jiných případech (například mezi while a end), existuje i nadále. To není zrovna konzistentní. Problémem může být i použití existující proměnné jako parametru cyklu (v našem případě i).

O dalších nepovedených věcech se můžete dočíst v zajímavé prezentaci „How Ruby Sucks“. A kdo že si to v ní dovolil to božské Ruby takhle pomluvit? Nikdo jiný než Yukihiro Matsumoto – ten, který Ruby vymyslel.

Závěr

Seriál o jazyku Ruby končí. Samozřejmě se nedalo pokrýt Ruby v celé šíři, ale to nebylo ani účelem. Ruby, stejně jako žádný jiný jazyk, nemůže být nástrojem na vyřešení každého problému. Ale na řešení mnoha problémů vhodné je. Doufám, že jsem alespoň trochu přispěl k tomu, aby se Ruby v takových případech bralo v úvahu jako možná alternativa Perlu, Pythonu, Javy nebo C#.

Anketa

Líbil se vám seriál o Ruby?

Našli jste v článku chybu?

7. 11. 2006 15:36

Nejsem si tak úplně jistý, zda se na to dá zcela spolehnout. Například následující kód

Thread.new { 10.times { |i| sleep 1; puts i } }
sleep 5
File.new('con:').getc
sleep 5

se v Ruby 1.8.4 pod Win XP chová tak, že to čekání na vstup znaku z konzoly zablokuje to vlákno z prvního řádku, dokud ten znak není zadán. Proto je v textu to slovo "může". Nicméně je pravda, že to mohlo být v textu formulováno přesněji, resp. měly být zmíněny vhodnější příklady, kdy se (nechtěně) blokuj…

29. 9. 2006 19:13

Jistě, že je komplexní – vždyť právě proto to trvá tak dlouho. :-D Mimochodem…
„Přístup použitý v Ruby však může zapříčinit, že např. déle trvající (blokující) vstupně/výstupní operace zablokuje všechna vlákna bez ohledu na to, zda mají s onou V/V operací něco společného.“
A není tohle náhodou nesmysl? Veškeré IO operace v Ruby jsou blokující na úrovni threadů, ale runtime Ruby používá pouze neblokující operace a pokud není operace dokončena, zablokuje pouze postižený t…
Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

DigiZone.cz: ČRa DVB-T2 ověřeno: Hisense a Sencor

ČRa DVB-T2 ověřeno: Hisense a Sencor

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?