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.