Ruby/Proste przykłady

Proste przykłady

edytuj

Napiszmy funkcję obliczającą silnię. Matematyczna definicja silni n to:

n! = 1                (gdy n==0)
   = n * (n-1)!       (w innym przypadku)

W Rubim możemy ją napisać w następujący sposób[1]:

def silnia(n)
  if n == 0
    1
  else
    n * silnia(n-1)
  end
end

Warto zauważyć powtarzające się wyrażenie end. Ruby nazywany jest przez to "algolopodobnym" językiem programowania. Właściwie, składnia Rubiego bardziej przypomina inny język - Eiffel. Można także zauważyć brak wyrażeń return. Nie są one potrzebne, ponieważ funkcja w Rubim zwraca ostatnią wartość, która była w niej liczona. Używanie wyrażenia return jest dozwolone, lecz niepotrzebne.

Wypróbujmy naszą funkcję silni. Dodanie jednej linii kodu daje nam działający program:

# Program, który liczy wartość silni z danej liczby
# Zapisz go jako silnia.rb

def silnia(n)
  if n == 0
    1
  else
    n * silnia(n-1)
  end
end

puts silnia(ARGV[0].to_i)

ARGV jest tutaj tablicą zawierającą argumenty linii poleceń, a to_i konwertuje łańcuch na liczbę całkowitą.

% ruby silnia.rb 1
1
% ruby silnia.rb 5
120

Czy nasz program zadziała z argumentem 40? Nie policzymy tego na kalkulatorze...

% ruby silnia.rb 40
815915283247897734345611269596115894272000000000

Działa! Ruby może sobie poradzić z każdą liczbą całkowitą, która zmieści się w pamięci naszego komputera. Więc możemy policzyć nawet 400!:

% ruby silnia.rb 400
64034522846623895262347970319503005850702583026002959458684
44594280239716918683143627847864746326467629435057503585681
08482981628835174352289619886468029979373416541508381624264
61942352307046244325015114448670890662773914918117331955996
44070954967134529047702032243491121079759328079510154537266
72516278778900093497637657103263503315339653498683868313393
52024373788157786791506311858702618270169819740062983025308
59129834616227230455833952075961150530223608681043329725519
48526744322324386699484224042325998055516106359423769613992
31917134063858996537970147827206606320217379472010321356624
61380907794230459736069956759583609615871512991382228657857
95493616176544804532220078258184008484364155912294542753848
03558374518022675900061399560145595206127211192918105032491
00800000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000

Nie możemy natychmiastowo sprawdzić poprawności obliczeń, ale muszą być prawidłowe. :-)

Pętla wejście/obliczenie i sposób prezentacji przykładów

edytuj

Kiedy wywołasz Rubiego bez argumentów, interpreter wczyta komendy ze standardowego wejścia i wykona je po zakończeniu wprowadzania:

% ruby
puts "witaj swiecie"
puts "zegnaj swiecie"
^D
witaj swiecie
zegnaj swiecie

Znak ^D powyżej oznacza Ctrl+D, wygodny sposób sygnalizowania, że wprowadzanie zostało zakończone w systemach uniksowych. W DOS/Windows spróbuj użyć F6 lub ^Z.

Ruby zawiera również program zwany irb, który pomaga wprowadzać kod bezpośrednio z klawiatury w interaktywnej pętli, pokazując na bieżąco rezultaty.

Oto krótka sesja z irb:

% irb
irb(main):001:0> puts "Witaj, swiecie."
Witaj, swiecie.
=> nil
irb(main):002:0> exit

"Witaj swiecie" jest wypisane przez puts. Następna linia, w tym przypadku nil, pokazuje cokolwiek, co zostało obliczone jako ostatnie. Ruby nie rozróżnia instrukcji i wyrażeń, więc obliczanie kawałka kodu jest równoważne z jego wykonaniem. Tutaj, nil oznacza, że puts nie zwraca żadnej (znaczącej) wartości. Zauważ, że możemy opuścić pętlę interpretera przez wpisanie exit.

W naszym podręczniku będziemy korzystać z programu irb oraz z przykładów zapisanych bezpośrednio jako kod źródłowy. Rezultat działania takiego kodu (wyjście), będziemy podawać jako komentarz, stosując oznaczenie: #=>. (Co to jest komentarz możesz sprawdzić tutaj.) Alternatywnie, będziemy czasem przedstawiać sesję z naszym kodem jako zapis okna terminala.

Przypisy

  1. Aby ułatwić zrozumienie, kod źródłowy we wszystkich przykładach został przetłumaczony na język polski (identyfikatory, łańcuchy znakowe, komentarze). Ponieważ Ruby w wersji stabilnej nie obsługuje jeszcze w pełni standardu Unicode, polskie znaki diaktryczne zostały zamienione na ich łacińskie odpowiedniki (ś na s, ł na l, itd...). Należy jednak wspomnieć, że powszechnie przyjęte i zalecane jest stosowanie języka angielskiego przy tworzeniu kodu niemalże w każdym języku programowania.