Po raz pierwszy usłyszałem o Rubym na Advogato, gdzie opisywał go jego twórca. Wiele reakcji nie było zbyt przychylnych: „Co, kolejny język? A nie lepiej – zamiast marnować siły – pomóc dodawać nowe możliwości do istniejacych języków?”. Yukihiro Matsumoto uważa, że nie.

Wygląda na to, że Japończycy – gdzie podobno Ruby jest bardzo popularny (O’Reilly wydało nawet książkę „Programming Ruby” po japońsku) – bardzo upodobali sobie „czystą” obiektowość, będącą jedna z podstawowych cech Ruby’ego.
Jak to wygląda w praktyce? Otóż wszystkie dane w Rubym są traktowane jako instancje tej samej klasy, bez różnicy, dzięki czemu wsystkie maja wspólne metody i własności. Weźmy prosty przykład:

   a=1   puts a.type   a=11111111111111111111111111111111111   puts a.type   a="a"    puts a.type  

W rezultacie otrzymamy:

  Fixnum  Bignum  String  

Dodatkowo, jak widzimy, Ruby przezroczyście konwertuje liczby w zależności od wielkości. Inna „elegancką” cechą tego języka jest oznaczanie zakresu zmiennych przy pomocy prefiksów $ i @, zaś stałe są pisane kapitalikami.
Ogólnie rzecz biorąc składnia jest bardzo intuicyjna i przejrzysta. Wynik działania każdego z poniższych fragmentów kodu będzie taki sam:

  a)    owoce=["jabłko","gruszka","pietruszka","czereśnia"]   puts owoce    b)   owoce=["jabłko","gruszka","pietruszka","czereśnia"]   for i in 1 .. owoce.length           puts owoce[i-1]       end  c)   owoce=["jabłko","gruszka","pietruszka","czereśnia"]   i = 0   while i < owoce.length           puts owoce[i]       end    d)   ["jabłko","gruszka","pietruszka","czereśnia"].each do |i|       puts i   end  

Jak widać, brak tu perlowego zamieszania z @,$... ;)
Na uwagę zasługuje zwłaszcza ostatni fragment. Ponieważ Ruby moze dokonywać ewaluacji całego bloku, można go zapisać jeszcze inaczej:

  ["jabłko","gruszka","pietruszka","czereśnia"].each   {|i| puts i}  

Równie intuicyjne są słowniki:

   telefony = { "marek" => 2211, "wojtek" => 4309 }   puts telefony["marek"]  

Cóż jednak można zrobić z samym językiem, jeśli brak odpowiednich bibliotek? Zobaczmy, jak sprawuje się Ruby we współpracy z Postgresem. Prosty kod przerobiony z z przykładu dostarczanego wraz z modułem do Postgresa dla Ruby'ego:

     #! /usr/bin/env ruby     require 'postgres'     conn = PGconn.connect(nil, nil, nil, nil, "postgres")   res = conn.exec("BEGIN")   res.clear   res = conn.exec("DECLARE chlopaki CURSOR FOR select * from test1")   res.clear     res = conn.exec("FETCH ALL in chlopaki")   if (res.status != PGresult::TUPLES_OK)     raise PGerror,"FETCH ALL command didn't return tuples properlyn"   end     for fld in res.fields     printf("%-15s",fld)   end   printf("nn")     res.result.each do |tupl|         tupl.each do |fld|           printf("%-15s",fld)         end         printf("n")       end   res = conn.exec("CLOSE chlopaki")   res = conn.exec("END")   res.clear   conn.close  

...zadziała bez problemu:

   [postgresu1@darkstar sample]$ ruby xm.rb   name           age     Joachim        9   Alcest         10  

Na koniec niespodzianka: Pod adresem http://easter.kuee.kyoto-u.ac.jp/~hiwada/ruby/ można znaleźć eksperymentalny kompilatori i JIT(x86) dla Ruby'ego.
Archiwalny news dodany przez użytkownika: arturs.
Kliknij tutaj by zobaczyć archiwalne komentarze.

Share →