04 luty 2006
Ruby - wprowadzenie, część 1 - absolutne podstawy
Ruby to interpretowany, w pełni obiektowo zorientowany język programowania. Powstał w Japonii, jego twórcą jest Yukihiro Matsumoto “Matz”. Bazuje na pomysłach z najróżniejszych źródeł, jest mieszanką Perla, Pythona, Lispa, Smalltalka i w mniejszym stopniu wielu innych języków.
Cechy, które wyróżniają Ruby’ego spośród tłumu to całkowita obiektowość (bliższa Smalltalkowi niż C++), pełny dostęp do i możliwość modyfikacji całej biblioteki klas, genialny zestaw dodatkowych narzędzi (”budowniczy” ala make, biblioteka do testów modułowych, menadżer pakietów itp., przeglądarka dokumentacji na kształt perldoca), naprawde świetny parser XML, klauzury, bardzo duża zwięzłość (nigdy więcej pisania setnej funkcji ładującej zawartość pliku do tablicy itp.). Przy tym wszystkim język jest naprawde “żywy” i pragmatyczny, na sieci leży mnóstwo dowiązań do baz danych, toolkitów GUI itp., co bywa problemem w przypadku innych bardziej egzotycznych języków, mających szanse konkurować z Rubym na polu możliwości samego języka.
Osobna sprawa to Rails, największy i najpopularniejszy framework do pisania aplikacji sieciowych w Rubym - w chwili obecnej zdobył on ogromną popularność za granicą i kto wie czy za jakiś czas nie stanie się on najpopularniejszą platformą do pisania aplikacji sieciowych wśród amatorów, zastępując PHP, o którym nie od dziś wiadomo że jest nie najlepsze. O wpływie jaki wywarł on na programowanie dla Internetu może świadczyć choćby liczba “portów” do innych języków - powstały edycje dla Javy, Pytona, a nawet JavaScriptu. Coś więc musi być na rzeczy. Co sprawiło że Rails zrobił taką kariere? Moim zdaniem jest to właśnie ów zwięzłość, w sensie możliwości zrealizowania jak największej ilości rzeczy jak najkrótszym kodem w jak najkrótszym czasie dla programisty, przy zachowaniu czytelności całego rozwiązania. Dlatego właśnie Railsa zrealizowano w tym, a nie innym języku.
[ Patrz też wpis "Dlaczego Ruby?" ]
Programy w Rubym, podobnie jak w większości języków skryptowych (choć w zasadzie czy jest sens mówić o “językach skryptowych”, w czasach gdy i tak większość nowoczesnych języków potrzebuje jak nie interpretera, to maszyny wirtualnej, a “skrypty” są często pełnoprawnymi aplikacjami?) można pisać i uruchamiać na dwa sposoby. Pierwszy to użycie interaktywnego interpretera, który pozwala linia po linii wprowadzać kod i “na żywo” obserwować jego zachowanie, druga zaś to standardowe pisanie programów w edytorze i uruchamianie ich za pomocą polecenia “ruby plik.rb” pod linuxem lub “ruby.exe plik.rb” pod windowsem. Interpreter polecam używać na początku, w celu zapoznania się z najbardziej podstawowymi rzeczami, a potem już tylko w razie potrzeby, do testowania krótkich kawałków kodu. Ci najbardziej nieufni mogą nawet spróbować Ruby’ego bez jego instalowania, za pomocą interpretera w postaci strony www, udostępnionego “why the lucky stiff”, znaną postać w światku Ruby’ego :) Więcej pod adresem: http://tryruby.hobix.com/
W czym pisać? Wybór edytora/IDE dla niejednego programisty jest kwestią religijną, więc ciężko może być przekonać kogoś kto ma już wyrobione zdanie, ja jednak osobiście polecam Emacsa. Dlaczego? Bo Emacs wielkim edytorem jest :> A poważnie - sam twórca Ruby’ego, Matz, jest wielkim fanem Emacsa i z racji tego “w standardzie” wraz z Rubym otrzymujemy tryb dla Emacsa kolorujący składnie, wcinający kod, pozwalający uruchomić interpreter wewnątrz edytora itp. Szperając po internecie możemy także znaleźć dodatki umożliwiajace czytanie dokumentacji Ruby’ego wewnątrz edytora, rozmaite “elektryczne” tryby (automatycznie domykające nawiasy i bloki) itp.
Właśnie, co do dokumentacji. Wraz z Rubym otrzymujemy także program ri, który pozwala na obejrzenie dokumentacji danej klasy czy metody. Tak więc polecenie “ri(.exe) String” pokaze nam krótki opis klasy String, a także listę jej składowych i metod.
Częścią Ruby’ego jest także program rdoc, pozwalający na wygenerowanie ów dokumentacji z której program ri korzysta, na podstawie komentarzy w kodzie bibliotek zainstalowanych w systemie. Program ten potrafi także tą samą dokumentacje przedstawić w formacie html i chm. Wygodniccy mogą też po prostu skorzystać z witryny http://www.ruby-doc.org/.
Przystępujemy do rzeczy - uruchamiamy teraz program irb, czyli interaktywny interpeter Ruby’ego. Ukazuję nam się takie coś:
irb(main):001:0>
Zacznijmy od czegoś prostego, np.:
irb(main):001:0> 2+2
Tadam!:
=> 4 irb(main):002:0>
Okej, to nie było zbyt porywające, ale nie od razu Kraków zbudowano. Do dyspozycji mamy standardowe matematyczne operatory: mnożenia - *, dzielenia - /, dodawania - +, odejmowania - -, reszty z dzielenia % i troche mniej typowy operator potęgowania **. Tu też czycha na nas pierwsza pułapka, piszemy bowiem:
irb(main):002:0> 5 / 2
A interpreter zwraca:
=> 2
Co się stało? Otóż 5 i 2 to są liczby całkowite, a więc ich dzielenie jest traktowane jako całkowite - więc zwracana jest liczba całkowita. Dokładny wynik otrzymamy pisząc:
irb(main):002:0> 5.0 / 2.0 => 2.5
Albo też:
irb(main):002:0> 5 / 2.0 => 2.5
Wniosek? Jeśli dzielna lub dzielnik jest liczbą zmiennoprzecinkową (truuudne słowo), to wynik też będzie taką liczbą. Teraz, kiedy już znamy potencjalne pułapki możemy się pobawić:
irb(main):008:0> 2**10 => 1024 irb(main):009:0> 1024 * 2**10 => 1048576 irb(main):010:0> 5.0/2.0 * 3**120 => 4.49252574978608e+57 irb(main):012:0> 100**100/2**24 => 59604644775390625(dużo zer)
To “=>” oznacza wartość zwracaną przez wyrażenie które wpisałeś zanim nacisnąłeś “Enter”. Gdybyś napisał w edytorze “2 * 2″ zapisał w pliku dwaplusdwa.rb i uruchomił “ruby dwaplusdwa.rb”, wcale nie otrzymałbyś wyniku. Zresztą przecież nie kazałeś go wyświetlić, a jedynie wyliczyć. Tekst w Rubym można wyprowadzić na najróżniejsze sposoby. Dostępne jest printf, ze stanardową składnią jak w C:
irb(main):003:0> printf("Dwa razy dwa to: %dn", 2*2) Dwa razy dwa to: 4 => nil
nil oznacza to samo co np. NULL w innych językach, czyli po prostu nic lub też fałsz. Czyli funkcja printf nie zwraca żadnej wartości. Moglibyśmy napisać także:
puts "Dwa razy dwa to: #{2*2}"
Co da ten sam wynik, albo w krótkiej i “surowej” (jeśli wpiszemy jako argument “n” to zostanie wyświetlone “n”, a nie zostanie wstawiona nowa lina) formie:
p "Dwa razy dwa to: #{2*2}"
Cóż oznacza ten zapis “#{2*2}”? Dajemy w ten sposób wyraz temu, że chcemy aby wyrażenie otoczone znakiem # i nawisami klamrowymi zostało zastąpione wartością zwracaną przez to wyrażenie. Możemy tam więc wstawić dowolny, poprawny kod Ruby’ego. Warto zauważyć, że liczby są automatycznie konwertowane do typu napisowego. Możemy to zrobić także ręcznie, używając “to_s”. Przy okazji pierwszy raz wywołamy jawnie metodę na rzecz obiektu:
irb(main):015:0> 4.to_s => "4"
Okej, nic ciekawego nam to nie dało. Ale funkcja to_s posiada jeden opcjonalny argument, pozwalający skonwertować liczbę do dowolnego systemu liczbowego:
irb(main):016:0> 1024.to_s(16) => "400" irb(main):017:0> 1024.to_s(2) => "10000000000"
Itp. itd.
Konwersja w drugą stronę także jest możliwa, tym razem z pomocą przychodzi nam metoda to_i.
irb(main):019:0> "400".to_i(16) => 1024 irb(main):022:0> "10000000000".to_i(2) => 1024
Składnia w której wywołuje się metodę bezpośrednio na rzecz stałej wartości może się wydawać dziwna osobom do tego nie przyzwyczajonym, ale tak naprawde jest to naturalne i w ten między innymi sposób objawia się pełna obiektowość.
Z liczbami możemy zrobić jeszcze sporo ciekawych rzeczy. Do dyspozycji mamy na przykład moduł Math pozwalający wykonywać wiele podstawowych operacji matematycznych. Możemy policzyć choćby sinus kąta:
irb(main):032:0> Math.sin(90 * (Math::PI/180)) => 1.0
Funkcje trygonomentryczne w Rubym, podobnie jak w wielu innych językach pobierają jako argument kąt w radianach dlatego nasze 90 stopnii przetworzyliśmy na radiany, mnożąc przez pi i dzieląc przez 180. Math::PI oznacza “weź stałą PI z modułu Math”. Co to jest moduł? Ktoś potrafiący już programować w takim czy innym języku może się już domyślać o co biega, ale na szczegóły przyjdzie czas później.
Linki:
http://www.ruby-lang.org - Oficjalna strona Ruby’ego
http://www.rubyonrails.org - Oficjalna strona Ruby On Rails
ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.4.tar.gz - Najnowszy Ruby w
edycji “źródłowej”
http://rubyforge.org/frs/download.php/2407/ruby182-14.exe - Ekspresowy
w instalacji Ruby pod Windows, również w wersji 1.8.4.
[ Z góry zastrzegam, że część druga będzie wtedy, kiedy będzie, absolutnie nie wcześniej ]
Dodaj do del.icio.us | Dodaj do wykop.pl
Komentarze ():
Rondelious, 4 luty 2006, 7:02 pm
Składnia rzeczywiście zalatuje perlem i pythonem, i to akurat nie jest zaleta. PHP ma składnie podobną do C, który w dużej mierze dzięki niej zdobył popularność. Ruby może zostać “ominięty” właśnie przez nia. Co nie ujmuje mu nic ze swojej funkcjonalności.
Megaman, 9 listopad 2006, 6:06 pm
Mam pytanie…. czy moglibyście ten kurs bardziej ulepszyć i uwzględnić programowanie w rogmakerze??
mike, 19 styczeń 2007, 8:05 pm
powiem szczerze, ze zaciekawil mnie ruby!:) i to wlasnie dzieki temu kursowi! ciekaw jestem jakie ma wieksze mozliwosci… :) do tej pory hold skladalem php, a obiektowka dopiero zaczalem sie fascynowac… szkoda ze tak malo jest polskich site`ow dotyczacych ruby`ego…
JLebi, 28 kwiecień 2007, 1:55 pm
Fajny kurs. Ruby ma dość dziwną składnię, preferuję Delphi i C++(C#).
Mam tylko jedno pytanie - czy są jeszcze jakieś IDE’e prócz ScITE?
sztywny, 29 kwiecień 2007, 10:31 am
Jeśli chodzi o IDE to polecam lekturę:
http://www.aptana.com/
http://blog.zabiello.com/articles/2007/03/16/netbeans6-and-ror
http://www.eclipsedltk.org/
Szczególnie wsparcie Rails w NetBeans zapowiada się obiecująco, ale nie miałem jeszcze okazji przetestować…
wro, 4 sierpień 2007, 2:29 am
Genialne ide dla poczoatkujacych http://deadlock.netbeans.org/hudson/job/ruby/
krotki film polecam
http://www.netbeans.org/download/flash/jruby_on_rails/jruby_on_rails.html
Filozof, 12 sierpień 2007, 6:43 pm
Bardzo mi się podoba artykuł. Idealnie wprowadza nowego programistę ;)
Maciej Piechotka, 8 wrzesień 2007, 6:23 pm
Netbeans ma dobre wsparcie dla ruby ale straszne dla (X)HTML. Eclipse na odwrót. Dowiedziełem się o emacs-rails i może w tym będe pisał.
hepi, 14 styczeń 2008, 7:12 pm
Witam! Proszę o pomoc.Nie jestem pewien czy akurat tutaj uzyskam odpowiedź i radę.
Od kilku godzin ukazuję mi się co 3 minuty napis na ekranie :” Ri spowodował wystąpienie błedu w RI.EXE. Nastąpi zamknięcie programu Ri”. to bardzo sorki ” upierdliwe” i rozpraszające. hepi
Shab, 9 luty 2008, 9:38 pm
Fajne ale nie wiem jak stworzyć plik w notatniku? Jak zapisze plik z końcówką .rb i uruchamiam , to okno po sekundzie znika!Z góry dzięki za pomoc.
sztywny, 9 luty 2008, 9:43 pm
Spróbuj dopisać “gets” jako ostatnia linia, wtedy konsola zamknie się dopiero po wciśnięciu entera - o ile dobrze rozumiem Twój problem.
badzok, 10 czerwiec 2008, 4:40 pm
fajne PHP ma plusy ale jest czasem irytujące
waldek, 7 sierpień 2008, 6:10 pm
podobam i sei ten kurs dzieki!
pozdro
http://www.monika.pl
http://www.monk.pl
Korkie, 25 październik 2008, 11:01 am
Fajny kurs. Z ruby’m dopiero zaczynam, ale myślę na poważnie o porzuceniu php przy którym można sobie włosy powyrywać na rzecz Ryby.
Szymon, 2 wrzesień 2009, 1:11 pm
trafiłem tu z googli, jesteś u nich wysoko w rankingu, gratuluję :) btw, jak widać znowu zmieniłem adres jogga ;)
regisu, 22 listopad 2010, 12:11 am
Ha ostatnio kumpel zainteresował mnie ruby i z googli trafiłem tutaj. Fajny tutorial :) Ciekawe to ruby.