Ruby on Rails, vol. 3 – podstawy Ruby
Skoro instalację języka Ruby i frameworka Rails mamy już za sobą, warto byłoby poświęcić trochę czasu na bliższe zapoznanie się zarówno z samym językiem, jak i podstawami frameworka.
Zaznaczam, że w tym miejscu podaję podstawy tego języka, które w żadnym razie nie wyczerpują tematu, a czasami są tylko szczytem góry lodowej. Jeśli Twoja ciekawość, Drogi Czytelniku, w którymś momencie jest niezaspokojona, pod koniec tego wpisu podaję kilka przydatnych linków, pod którymi znaleźć powinieneś odpowiedzi na interesujące Cię pytania. Zapraszam oczywiście również do komentowania wpisu – wszelkie uczestnictwo jest jak najbardziej mile widziane!
No, ale zacznijmy już w końcu, prawda?
Nieco historii…
Jak każdy tutorial, czy opis technologii, tak i tutaj zacznę od pewnego rysu historycznego, który pozwoli Ci nieco przychylniej spojrzeć na język Ruby i Railsy.
Zacznijmy od samego języka Ruby. Jest to stosunkowo młody język, bo jego historia zaczęła się w roku 1995, kiedy to Yukihiro Matsumoto (pseudonim Matz) stworzył interpretowany, w pełni obiektowy i dynamicznie typowany język programowania, który nazwał Ruby (z angielskiego – rubin).
Aby zdobyć sobie popularność, trzeba było tylko 8. lat – wtedy to, w 2008 roku, na rynku pojawił się framework Ruby on Rails. Od tego czasu (darujmy sobie szczegóły historii i ewolucji Ruby’iego i Railsów) masowo zdobywa sobie popularność.
Co jest przyczyną aż takiej „kariery” Railsów (umówmy się: kiedy używam słowa Rails, to w kontekście połączenia Ruby’iego i frameworka Rails; kiedy natomiast wskazuję wyraźnie „ruby” – piszę o samym języku programowania)? Praktycy podawać tutaj będą dużo przyczyn, ale najczęściej wymienianymi są: prostota, szybkość pisania kodu (trudno właściwie mówić tutaj o pisaniu… ale nie uprzedzajmy wydarzeń), intuicyjność… Te zachwyty można by mnożyć, jednak wróćmy do głównego wywodu.
Co jeszcze nas w tym miejscu powinno interesować? Acha, licencjonowanie. Oczywiście Ruby i framework są otwartym oprogramowaniem, licencjonowanym na zasadach GPL. Czyli – w zasadzie dowolność.
Teraz przejdźmy dalej, do rzeczy bardziej interesujących…
Podstawowe typy danych
Ruby wspiera wszystkie typy danych znane programistom. Są to więc stringi, integery, floaty, itd. Nieco inaczej się nazywają, ale – jak napisano wyżej – jest to jeden z języków typowanych dynamicznie, w związku z czym nie musimy jawnie deklarować używanego typu danych, jak to ma miejsce chociażby w języku C. Tutaj wystarczy napisać:
puts 1+2
w odpowiednim miejscu, żeby „na wyjściu” otrzymać wynik z dodawania 1 + 2.
Ach, ale jeszcze nie wspomnieliśmy o najpopularniejszych sposobach pracy z Rubym!
Już nadrabiam…
Jeśli tak się nieszczęśliwie składa, że naszym środowiskiem roboczym jest jedynie słuszny Windows, nie rozpaczajmy! Mamy tutaj do dyspozycji „okienkowego” (a jakże…) fxri. Wyglądem przypomina komunikator w rodzaju GG, w swojej przed-betowej wersji. Ta całkiem niepozornie wyglądająca aplikacyjka może być całkiem przydatnym narzędziem, szczególnie teraz, kiedy stawiamy dopiero pierwsze kroki… Zwróćmy chociażby uwagę na lewą, dość długą listę klas i metod. Wystarczy jedno kliknięcie, by dowiedzieć się składni wybranej klasy, czy metody. Taki podręczny help na pewno nam nie zaszkodzi. Ale wróćmy teraz do głównego wywodu.
Wpiszmy więc do naszego fxri puts 1+2. Po zatwierdzeniu Enterem otrzymamy poniżej coś takiego:
3
=> nil
Trójka – to oczywiście wynik naszego dodawania, bo właśnie takie polecenie wydaliśmy (1+2). Komenda puts była zwykłym poleceniem wyświetlenia ciągu tekstowego na domyślnym wyjściu. A ponieważ jako ciąg tekstowy wpisaliśmy 1+2, interpreter policzył wynik tego dodawania i po prostu nam go wypisał.
Zmodyfikujmy teraz nieco nasze polecenie; napiszmy
puts "1+2"
No, tym razem rzeczywiście zażyczyliśmy sobie na wyjściu stringa składającego się z trzech znaków! (1, 2, oraz znaku +). Na wyjściu otrzymaliśmy
1+2
=> nil
Aby zachować w tym miejscu pewną dokładność, przyznać należy, że polecenie puts dokłada na końcu ciągu znak nowej linii, dlatego też => nil pojawia się niżej.
Z kolei => nil oznacza zakończenie działania naszego „programu” (mówiąc w wielkim skrócie, ale o tym kiedy indziej…).
Aby karetka nie przechodziła nam do kolejnej linii, wystarczy nieco zmodyfikować nasz program:
print „1+2″
Teraz na wyjściu otrzymamy
1+2
=> nil
W ten właśnie sposób doszliśmy do miejsca, w którym zaczyna się każdy podręcznik programowania, jaki tylko wzięlibyśmy do ręki: czas na napisanie „Hello world!„.
Jeśli nie jesteś na tyle bystry, by zrobić to samemu, masz dwa wyjścia: przewinąć nieco stronę i raz jeszcze przeczytać ten wpis, albo skorzystać z „gotowca”, który wygląda następująco:
puts „Hello world”
Prostsze, niż budowa cepa, prawda?
Wejście-wyjście
Poznaliśmy już dwie metody wyprowadzenia ciągu znaków na standardowe wyjście, jakim jest ekran konsoli. Są to:
puts – wyprowadzenie ciągu znaków na ekran i dodanie na koniec „ukrytego” znaku nowej linii, oraz
print – jak wyżej, tylko bez dodawania nowej linii.
Jest jeszcze printf, który działa identycznie, jak analogiczna funkcja znana z języka C (więcej informacji znajdziecie tutaj).
Czas bliżej poznać polecenie open – najprostsze z serii poleceń operujących na plikach.
Przeanalizujmy prosty przykład:
plik = open "C:\\dowolny_plik.txt"
puts plik.gets
a teraz porównajmy go z nieco dłuższym zapisem:
open "C:\\dowolny_plik.txt" do |plik|
puts plik.gets
end
Skutek działania tych dwóch zapisów jest w zasadzie ten sam: oba otwierają dowolny_plik.txt, pobierają z niego pierwszą linię, po czym wypisują ją (stosując znane nam już puts) na ekranie.
Odczytu danych z dowolnego w zasadzie pliku możemy dokonać na dwa sposoby: klasycznie, lub w sposób blokowy. Zarknijmy na dwa przykłady:
plik = File.open "C:\\dowolny_plik.txt"
while ln = plik.gets do puts ln end
plik.close
i drugi:
File.open "C:\\dowolny_plik.txt" do |plik|
while ln = plik.gets do puts ln end
end
Przewaga tego drugiego sposobu widoczna jest wtedy, kiedy przyjdzie nam śledzić wyjątki. W pierwszym przykładzie, jeśli wystąpi błąd proces może pominąć zamknięcie pliku, czego oczywiście byśmy nie chcieli. W drugim przykładzie plik zostanie zawsze zamknięty, nawet w przypadku wystąpienia błędu. Dlatego oczywiście zalecany jest ten drugi, jak można się domyślić…
Na tym zakończymy „podstawy podstaw” Ruby’ego. W następnym odcinku zajmiemy się sterowaniem programem.
Zaczęło się ciekawie, ale znowu zbyt długie przestoje, sądząc po datach kolejnych wpisów…
Gdyby kolejne posty (szczególnie na temat RoR) pojawiały się częściej, strona na pewno by na tym zyskała.