DWO 2009 - Ruby

59
Ruby Ruby Ruby

description

Ruby programming language introduction, presented at Dni Wolnego Programowania 2009 in Bielsko-Biała, Poland

Transcript of DWO 2009 - Ruby

Page 1: DWO 2009 - Ruby

RubyRuby

Ruby

Page 2: DWO 2009 - Ruby

2

RubyRuby WstępWstęp

Kim jestem?Kim jestem? Kim są słuchacze?Kim są słuchacze? Po co ta prezentacja?Po co ta prezentacja?

Zainteresować językiem RubyZainteresować językiem Ruby Pokazać prostotę i możliwościPokazać prostotę i możliwości Objaśnić jak zacząć przygodęObjaśnić jak zacząć przygodę

Page 3: DWO 2009 - Ruby

3

RubyRuby PlanPlan

I.I. RekonesansRekonesans

II.II. Pierwszy dotykPierwszy dotyk

III.III. wRubyWstąpieniewRubyWstąpienie Konstrukcje składnioweKonstrukcje składniowe Typy wbudowaneTypy wbudowane

IV.IV. Coś większegoCoś większego

V.V. PostludiumPostludium

Page 4: DWO 2009 - Ruby

4

RubyRuby Część ICzęść I

Rekonesans

Page 5: DWO 2009 - Ruby

5

RubyRuby Ruby? A co to takiego?Ruby? A co to takiego?

Wzór chemicznyWzór chemicznyAlAl

22OO

33:Cr:Cr+3+3

G sto ćę śG sto ćę ś3,95 do 4,1 g/cm3,95 do 4,1 g/cm33

BarwaBarwaczerwona o ró nych żczerwona o ró nych ż

odcieniach i ró nym stopniu żodcieniach i ró nym stopniu żnasycenia; niekiedy wielobarwnynasycenia; niekiedy wielobarwny

LuminescencjaLuminescencjawyra na, nadaje źwyra na, nadaje ź

rubinom szczególnego rubinom szczególnego kolorytu, podwy szaj c ich ż ąkolorytu, podwy szaj c ich ż ą

walory estetyczne.walory estetyczne.

RubinRubin

minerałminerałz gromady tlenkówz gromady tlenków

Page 6: DWO 2009 - Ruby

6

RubyRuby PowstaniePowstanie

Twórca: Twórca: Yukihiro Matsumoto [Matz]Yukihiro Matsumoto [Matz]

Czas powstania:Czas powstania: rok 1995 rok 1995 Popularna wersja: 1.8.7Popularna wersja: 1.8.7

[czerwiec 2008][czerwiec 2008]

Najnowsza wersja: 1.9.1Najnowsza wersja: 1.9.1 [styczeń 2009][styczeń 2009]

Czekamy na Ruby 2.0Czekamy na Ruby 2.0

Page 7: DWO 2009 - Ruby

7

RubyRuby CechyCechy

InterpretowanyInterpretowany[chociaż są kompilatory just-in-time][chociaż są kompilatory just-in-time]

ObiektowyObiektowy Dynamicznie typowanyDynamicznie typowany Automatyczne zarządzanie pamięciąAutomatyczne zarządzanie pamięcią Podobny do: Podobny do: Python, Smalltalk, Perl, Python, Smalltalk, Perl,

IconIcon Nie posiada specyfikacji!Nie posiada specyfikacji!

Page 8: DWO 2009 - Ruby

8

RubyRuby ImplementacjeImplementacje

Ruby MRI – Matz's Ruby InterpreterRuby MRI – Matz's Ruby Interpreter

[implementacja referencyjna][implementacja referencyjna] YARV – Yet another Ruby VMYARV – Yet another Ruby VM

[standard od wersji 1.9][standard od wersji 1.9]

JRuby – implementacja w JavieJRuby – implementacja w Javie XRuby – kompilacja do Java bytecodeXRuby – kompilacja do Java bytecode IronRuby – implementacja w .NETIronRuby – implementacja w .NET MacRuby – implementacja Apple'aMacRuby – implementacja Apple'a RubiniusRubinius

Page 9: DWO 2009 - Ruby

9

RubyRuby Część IICzęść II

Pierwszy dotyk

Page 10: DWO 2009 - Ruby

10

RubyRuby Piszesz - maszPiszesz - masz

for x in 5..15for x in 5..15 print xprint x22

endend

'dzień dobry' include 'dobry'?'dzień dobry' include 'dobry'?

'abecadło' each char do c'abecadło' each char do c print c,capitalizeprint c,capitalizeendend

100 times do100 times do print Będę mówił 'rubi', a nie 'rabi'!print Będę mówił 'rubi', a nie 'rabi'!endend

Page 11: DWO 2009 - Ruby

11

RubyRuby Piszesz - maszPiszesz - masz

for x in for x in 55....1515 printprint x x****22endend

'dzień dobry''dzień dobry'.include?.include? 'dobry''dobry'

'abecadło''abecadło'.each_char.each_char do do ||cc|| printprint c c.capitalize.capitalizeendend

100100.times.times do do printprint "Będę mówił 'rubi', a nie 'rabi'!""Będę mówił 'rubi', a nie 'rabi'!"endend

Page 12: DWO 2009 - Ruby

12

RubyRuby Gdzie pisać?Gdzie pisać?

Pliki Pliki .rb.rb requirerequire loadload

SkryptySkrypty

irb - Interactive Ruby Shellirb - Interactive Ruby Shell

#!/usr/bin/env ruby#!/usr/bin/env ruby

......

Page 13: DWO 2009 - Ruby

13

RubyRuby Pomocy!Pomocy!

RDocRDoc ruby-doc.orgruby-doc.org riri

metoda metoda helphelp refleksjarefleksja

.methods.methods .inspect.inspect

Page 14: DWO 2009 - Ruby

14

RubyRuby Część IIICzęść III

wRubyWst pienieą

Page 15: DWO 2009 - Ruby

15

RubyRuby ObiektowośćObiektowość

WszystkoWszystko jest obiektem jest obiektem … … nawet nawet nilnil … … nawet klasa nawet klasa [instancja klasy Class][instancja klasy Class]

““Class Class is an objectis an object, , andand Object Object is a is a classclass.”.” [Hal Fulton][Hal Fulton]

Wszystko jest wyrażeniem i zwraca Wszystko jest wyrażeniem i zwraca wartośćwartość

Wszystko oprócz Wszystko oprócz nil nil i i falsefalse jest jest prawdąprawdą

Page 16: DWO 2009 - Ruby

16

RubyRuby Zmienne i stałeZmienne i stałe

ZmienneZmienne od małej litery lub znaku od małej litery lub znaku __ słowa oddzielone znakiem _słowa oddzielone znakiem _

StałeStałe od dużej literyod dużej litery CamelCaseCamelCase

Zmienne globalneZmienne globalne od znaku $od znaku $

SymboleSymbole od znaku od znaku ::

Page 17: DWO 2009 - Ruby

17

RubyRuby KomentarzeKomentarze

jednolinijkowejednolinijkowe

wielolinijkowewielolinijkowe

# Jednolinijkowy komentarz# Jednolinijkowy komentarz

=begin=begin Ten komentarz nie wnosiTen komentarz nie wnosi nic konstruktywnegonic konstruktywnego poza zajęciem czasu czytelnika.poza zajęciem czasu czytelnika.=end=end

Page 18: DWO 2009 - Ruby

18

RubyRuby KonstrukcjeKonstrukcjeskładnioweskładniowe

operatoryoperatory

instrukcje warunkoweinstrukcje warunkowe

pętlepętle

metodymetody

klasyklasy

modułymoduły

dziedziczenie & mixinsdziedziczenie & mixins

blokibloki

wyrażenia lambdawyrażenia lambda

wyjątkiwyjątki

Page 19: DWO 2009 - Ruby

19

RubyRuby OperatoryOperatory

arytmetycznearytmetyczne+ - * / % + - * / % ****

przypisaniaprzypisania= += -= *= /= %= **= |= &= >>= <<== += -= *= /= %= **= |= &= >>= <<=||=||= &&= &&=

porównaniaporównania== .eql? .equal? != < > >= <= == .eql? .equal? != < > >= <= <=><=> =~=~ !~ !~

logicznelogiczne&& || ! and or not&& || ! and or not

bitowebitowe~ | & ^ << >>~ | & ^ << >>

inneinne[] []= [] []= .. ….. … ! not ! not

Nie ma operatorów ++ i --Nie ma operatorów ++ i --

Page 20: DWO 2009 - Ruby

20

RubyRuby OperatoryOperatory

==, .eql?, .equal?==, .eql?, .equal?

|| oraz || oraz oror, && oraz , && oraz and –and – różnica w priorytetach różnica w priorytetach

55 ==== 5.05.0 # => true# => true55.eql?.eql? 5.05.0 # => false# => false55.equal?.equal? 5.05.0 # => false# => false55.equal?.equal? 55 # => true# => true

'a''a' ==== 'a''a' # => true# => true'a''a'.eql?.eql? 'a''a' # => true# => true'a''a'.equal?.equal? 'a''a' # => false# => false

a a == falsefalse oror 55 # => 5, a = false# => 5, a = falsea a == falsefalse |||| 55 # => 5, a = 5# => 5, a = 5

Page 21: DWO 2009 - Ruby

21

RubyRuby OperatoryOperatory

||=||=

wielokrotne przypisaniewielokrotne przypisanie

a a == a a |||| "default value""default value"

a a ||=||= "default value""default value"

a, b a, b == b, a b, a

a, b, c a, b, c == get_something get_something

Page 22: DWO 2009 - Ruby

22

RubyRuby InstrukcjeInstrukcjewarunkowewarunkowe

if … [elsif …] [else …] endif … [elsif …] [else …] end

… … if …if …

unless unless zamiast zamiast if notif not

x x = if= if a a >> 55 100100elsifelsif a a >> 100100 putsputs 'miliard!''miliard!' 1010****99elseelse 11endend

putsputs 'miliard!''miliard!' ifif a a >> 100100

Page 23: DWO 2009 - Ruby

23

RubyRuby InstrukcjeInstrukcjewarunkowewarunkowe

… … ? … : ...? … : ...

case … when … [else ...] endcase … when … [else ...] end

x x == a a >> 100100 ? ? 'miliard!''miliard!' : : 'mało''mało'

x x == casecase x x whenwhen 00......55 11 whenwhen 55....100100 5050 elseelse 'miliard!''miliard!' endend

Page 24: DWO 2009 - Ruby

24

RubyRuby PętlePętle

while … [do] … endwhile … [do] … end

… … while …while …

untiluntil zamiast zamiast while notwhile not

whilewhile a a >> 1010 aa /= /= 3.03.0endend

putsputs "Iteracja nr "Iteracja nr #{#{ii+=+=11}}"" whilewhile i i << 1010

Page 25: DWO 2009 - Ruby

25

RubyRuby PętlePętle

for … in … [do] … endfor … in … [do] … end

breakbreak nextnext redoredo retryretry

metody na obiektach typu metody na obiektach typu IntegerInteger timestimes uptoupto downtodownto

forfor i i inin 11....88 putsputs i iendend

Page 26: DWO 2009 - Ruby

26

RubyRuby MetodyMetody

wywołaniewywołanie

wywołanie z argumentamiwywołanie z argumentami

wywołanie z wykorzystaniem wartości zwracanejwywołanie z wykorzystaniem wartości zwracanej

nawiasy opcjonalnenawiasy opcjonalne … … ale zalecane, bo:ale zalecane, bo:

invoke_methodinvoke_methodinvoke_method()invoke_method()

invoke_method a, b, cinvoke_method a, b, cinvoke_method(a, b, c)invoke_method(a, b, c)

a a == invoke_method(a, b, c) invoke_method(a, b, c)putsputs invoke_method(a, b, c) invoke_method(a, b, c)

one_method one_method 55, another_method , another_method 1010, , 100100

Page 27: DWO 2009 - Ruby

27

RubyRuby MetodyMetody

definiowaniedefiniowanie

return return opcjonalneopcjonalne … … chyba że nie jest ostatnią instrukcjąchyba że nie jest ostatnią instrukcją

defdef something_interesting something_interesting first_statementfirst_statement second_statementsecond_statement third_statement_will_return_sththird_statement_will_return_sthendend

def something_interestingdef something_interesting returnreturn falsefalse ifif $SthWrongHappened$SthWrongHappened second_statementsecond_statement third_statement third_statement # will return sth unless $SthWrongHappened# will return sth unless $SthWrongHappened

endend

Page 28: DWO 2009 - Ruby

28

RubyRuby MetodyMetody

definiowanie z argumentamidefiniowanie z argumentami

argumenty domyślneargumenty domyślne

lista argumentówlista argumentów

defdef something_interesting(a, b, c) something_interesting(a, b, c) ......endend

defdef something_interesting(a, b something_interesting(a, b == truetrue)) ......endend

defdef something_interesting(a, something_interesting(a, **other_args)other_args) ......endend

Page 29: DWO 2009 - Ruby

29

RubyRuby Metody - konwencjeMetody - konwencje

Bang methodsBang methods zakończone znakiem zakończone znakiem !! potencjalnie 'niebezpieczne'potencjalnie 'niebezpieczne' np. modyfikują obiekt 'w miejscu'np. modyfikują obiekt 'w miejscu' najczęściej posiadają odpowiedniki niemodyfikujące, najczęściej posiadają odpowiedniki niemodyfikujące,

które produkują nowe obiektyktóre produkują nowe obiekty np. np. sort!, upcase!, reverse! sort!, upcase!, reverse! w kolekcjachw kolekcjach

Metody 'pytające'Metody 'pytające' zakończone znakiem zakończone znakiem ?? najczęściej zwracają najczęściej zwracają truetrue lub lub falsefalse np. np. empty?, include?, nil?empty?, include?, nil?

Page 30: DWO 2009 - Ruby

30

RubyRuby KlasyKlasy

class … endclass … end nazwa od dużej literynazwa od dużej litery wewnątrz definicje metodwewnątrz definicje metod … … oraz instrukcjeoraz instrukcje metoda metoda initializeinitialize metodametoda inspect inspect zmienne instancjizmienne instancji

od znaku od znaku @@ zmienne klasyzmienne klasy

od znaków od znaków @@@@ własne akcesory własne akcesory

akcesory akcesory attr_reader, attr_writer, attr_accessorattr_reader, attr_writer, attr_accessor

classclass MiliardMiliard putsputs "Ładowanie...""Ładowanie..."

attr_readerattr_reader :value:value defdef initialize(value) initialize(value) @value@value == value value endend

defdef introduce_yourself introduce_yourself putsputs "Wartość: "Wartość: #{@value}#{@value}"" endend

defdef value value==(v)(v) @value@value == v v ifif v v >> 100100 endendendend

Page 31: DWO 2009 - Ruby

31

RubyRuby KlasyKlasy

metoda instancjimetoda instancji konwencja:konwencja:

Klasa#metodaKlasa#metoda

metoda klasymetoda klasy konwencja:konwencja:

Klasa::metodaKlasa::metoda

classclass DocumentDocument defdef selfself.read_from.read_from(filename)(filename) ...... endendendend

d d == DocumentDocument.read_from.read_from(('dok.txt''dok.txt'))

class class DocumentDocument defdef send_to(email) send_to(email) ...... endendendend

d d == DocumentDocument.new.newdd.send_to.send_to(('[email protected]''[email protected]'))

Page 32: DWO 2009 - Ruby

32

RubyRuby KlasyKlasy

klasy nigdy nie są zamknięte!klasy nigdy nie są zamknięte! można rozszerzać i modyfikować istniejącemożna rozszerzać i modyfikować istniejące … … również wbudowane :)również wbudowane :)

pojedyncze obiekty też są otwarte!pojedyncze obiekty też są otwarte!

class class StringString defdef inspect inspect "Ukryta wartość""Ukryta wartość" endend defdef starts_with_capital? starts_with_capital? (('A''A'....'Z''Z')).include?.include?((selfself[[00, , 11]])) endendendend

Page 33: DWO 2009 - Ruby

33

RubyRuby KlasyKlasy

poziomy dostępu metodpoziomy dostępu metod publicpublic protectedprotected privateprivate

def def SomeClassSomeClass defdef some_public_method some_public_method endend protectedprotected defdef some_protected_method some_protected_method endend privateprivate defdef some_private_method some_private_method endendendend

def def SomeClassSomeClass publicpublic :sth_public:sth_public protectedprotected :sth_protected:sth_protected privateprivate :sth_private:sth_private

defdef ...... ......endend

Page 34: DWO 2009 - Ruby

34

RubyRuby Obiekty jakoObiekty jakoodbiorcy metododbiorcy metod

każda metoda jest 'wysyłana' do obiektukażda metoda jest 'wysyłana' do obiektu

sendsend

method_missingmethod_missing

class class MiliardMiliard defdef method_missingmethod_missing(method_id)(method_id) putsputs "Nie mam metody "Nie mam metody #{#{method_idmethod_id}}!"!" endendendend

"abc""abc".send.send(("capitalize""capitalize"))

Page 35: DWO 2009 - Ruby

35

RubyRuby ModułyModuły

tworzą przestrzeń nazwtworzą przestrzeń nazw

mogą zostać włączone do innego modułu lub klasymogą zostać włączone do innego modułu lub klasy

modulemodule ComputingMachineComputingMachine PerformanceUnitPerformanceUnit == 'FLOPS''FLOPS' defdef ComputingMachineComputingMachine.play_chess.play_chess ...... endendendend

putsputs ComputingMachineComputingMachine::::PerformanceUnitPerformanceUnitComputingMachineComputingMachine.play_chess.play_chess

Page 36: DWO 2009 - Ruby

36

RubyRuby MixinsMixins

includeinclude można włączyćmożna włączyć

kilka modułówkilka modułów nie można stworzyćnie można stworzyć

hierarchiihierarchii

modulemodule DebugAbilityDebugAbility defdef error_info error_info "Something bad happened...""Something bad happened..." endendendend

classclass MiliardMiliard includeinclude DebugAbilityDebugAbility

......endend

putsputs MiliardMiliard.new.error_info.new.error_info

Page 37: DWO 2009 - Ruby

37

RubyRuby DziedziczenieDziedziczenie

tylko jednobazowetylko jednobazowe hierarchia klashierarchia klas Object – Object – korzeńkorzeń polimorfizmpolimorfizm selfself supersuper zmienne instancjizmienne instancji

nie są związanenie są związane

z klasą, ale z obiektemz klasą, ale z obiektem

class class MiliardMiliard defdef introduce_yourself introduce_yourself putsputs "Miliard!""Miliard!" endendendend

classclass LepszyMiliard LepszyMiliard << Miliard Miliard defdef introduce_yourself introduce_yourself supersuper putsputs "Lepszy Miliard!""Lepszy Miliard!" endend

defdef to_s to_s "Lepszy Miliard!""Lepszy Miliard!" endendendend

Page 38: DWO 2009 - Ruby

38

RubyRuby BlokiBloki

smaczny kąseksmaczny kąsek do … enddo … end

{ … }{ … }

są przekazywane do metodysą przekazywane do metody yieldyield

1010.times.times do do ||ii|| putsputs i iendend

1010.times.times {{ ||ii|| putsputs i i }}

def give_me_somethingdef give_me_something sth sth == randrand.to_s.to_s yieldyield(sth)(sth)endend

give_me_something give_me_something {{ ||xx|| putsputs "I've got "I've got #{#{xx}}!"!" }}

Page 39: DWO 2009 - Ruby

39

RubyRuby Wyrażenia lambdaWyrażenia lambda

bloki nie są obiektami...bloki nie są obiektami... … … ale mogą się nimi stać :)ale mogą się nimi stać :) klasa klasa ProcProc metodymetody lambda lambda ii proc proc

nie można przekazywać metod do innych metod...nie można przekazywać metod do innych metod... … … ale można przekazywać obiekty klasyale można przekazywać obiekty klasy Proc Proc metoda nie może zwrócić innej metody...metoda nie może zwrócić innej metody... … … ale może zwrócić obiekt klasy ale może zwrócić obiekt klasy ProcProc

miliard miliard == lambdalambda {{ putsputs "Miliard!""Miliard!" }}miliardmiliard.class.class # => Proc# => Procmiliardmiliard.call.call # => "Miliard!"# => "Miliard!"

Page 40: DWO 2009 - Ruby

40

RubyRuby WyjątkiWyjątki

przechwytywanie – przechwytywanie – rescue, ensurerescue, ensure

można też objąć całą metodęmożna też objąć całą metodę

beginbegin dangerous_methoddangerous_methodrescuerescue IOErrorIOError putsputs "Oh, no! IO Error!""Oh, no! IO Error!"rescuerescue AnotherExceptionAnotherException =>=> e e putsputs "Dunno what happened 0_o""Dunno what happened 0_o", e, e.message.messageensureensure # here we enter always# here we enter alwaysendend

def some_methoddef some_method dangerous_methoddangerous_methodrescuerescue putsputs "Oh, no! Error!""Oh, no! Error!"endend

Page 41: DWO 2009 - Ruby

41

RubyRuby WyjątkiWyjątki

rzucanie - rzucanie - raiseraise

dziedziczą po klasie dziedziczą po klasie ExceptionException domyślnie domyślnie RuntimeErrorRuntimeError

def dangerous_method(arg)def dangerous_method(arg) raiseraise 'Invalid argument''Invalid argument' unlessunless arg arg raiseraise ArgIsZeroErrorArgIsZeroError, , 'Arg is zero''Arg is zero' ifif arg arg ==== 00 ......endend

Page 42: DWO 2009 - Ruby

42

RubyRuby Typy wbudowaneTypy wbudowane

liczbyliczby

łańcuchy tekstowe [string]łańcuchy tekstowe [string]

zakresyzakresy

tablicetablice

tablice asocjacyjne [hash]tablice asocjacyjne [hash]

wyrażenia regularnewyrażenia regularne

Page 43: DWO 2009 - Ruby

43

RubyRuby LiczbyLiczby

WbudowaneWbudowane

Numeric Numeric IntegerInteger

Fixnum [do 2Fixnum [do 23030 - 1] - 1]● Bignum [od 2Bignum [od 23030]]

FloatFloat BiblioteczneBiblioteczne

NumericNumeric Complex [liczby zespolone]Complex [liczby zespolone] Rational [liczby wymierne]Rational [liczby wymierne]

Page 44: DWO 2009 - Ruby

44

RubyRuby Łańcuchy tekstoweŁańcuchy tekstowe

klasa klasa StringString

mutowalnemutowalne

ograniczone znakami ' lub "ograniczone znakami ' lub "

specjalne, ograniczone znakami `specjalne, ograniczone znakami `

wykonywane przez system operacyjnywykonywane przez system operacyjny #{ … } #{ … } - tylko gdy "- tylko gdy " [string interpolation][string interpolation]

escape sequences escape sequences –– od znaku \od znaku \

bogaty zestaw metodbogaty zestaw metod

do wersji 1.8 nie obsługują natywnie Unicode'u :(do wersji 1.8 nie obsługują natywnie Unicode'u :(

… … ale w 1.9 już tak :)ale w 1.9 już tak :)

Page 45: DWO 2009 - Ruby

45

RubyRuby ZakresyZakresy

klasa klasa RangeRange

wyrażają sekwencjewyrażają sekwencje

prawostronnie domknięteprawostronnie domknięte

operator ..operator .. prawostronnie otwarteprawostronnie otwarte

operator ...operator ...

(('a''a'....'g''g')).include?.include? 'r''r' # => false# => false((1010......100100) ) ====== 5050 # => true# => true((00....2020)).step.step((55)).to_a.to_a # => [0, 5, 10, 15, 20]# => [0, 5, 10, 15, 20]

Page 46: DWO 2009 - Ruby

46

RubyRuby TabliceTablice

klasa klasa ArrayArray

mutowalnemutowalne

ograniczone znakami ograniczone znakami [ [ ii ] ]

mogą zawierać dowolne obiektymogą zawierać dowolne obiekty

bogaty zestaw metodbogaty zestaw metod

a a == [[33, , [["inna""inna", , "tablica""tablica"]], , nilnil, , "koniec""koniec"]]aa[[00]] # => 3# => 3aa[-[-11]] # => "koniec"# => "koniec"aa[-[-22, , 22]] # => [nil, "koniec"]# => [nil, "koniec"]aa[[100100]] # => nil# => nilaa.each.each {|{|ee|| putsputs e e}}aa.select.select {|{|ee|| e e.class.class ==== StringString}} # => ["koniec"]# => ["koniec"]

Page 47: DWO 2009 - Ruby

47

RubyRuby Tablice asocjacyjneTablice asocjacyjne

klasa klasa HashHash

klucze i wartościklucze i wartości

brak zachowania kolejnościbrak zachowania kolejności

wyszukiwanie i wstawianie w czasie O(1)wyszukiwanie i wstawianie w czasie O(1)

ograniczone znakami ograniczone znakami { { ii } }

bogaty zestaw metodbogaty zestaw metod

h h == {{11 =>=> 'jeden''jeden', , 22 =>=> 'dwa''dwa', , 1010 =>=> 'miliard''miliard', , :some_symbol:some_symbol =>=> [[22, , 33]] }}hh[[1010]] # => 'miliard'# => 'miliard'hh[[55]] # => nil# => nilhh.each_pair.each_pair {|{|k, vk, v|| putsputs ""#{#{kk}} = = #{#{vv}}"" }}hh.keys.keys # => [1, 2, :some_symbol, 10]# => [1, 2, :some_symbol, 10]

Page 48: DWO 2009 - Ruby

48

RubyRuby Wyrażenia regularneWyrażenia regularne

klasa klasa RegexpRegexp

wbudowane w językwbudowane w język

ograniczone znakami ograniczone znakami //

operatoroperator =~ =~

metodametoda match match

"dwa i 3/4""dwa i 3/4" =~=~ /\d//\d/ # => 6# => 6"dwa i 3/4""dwa i 3/4" =~=~ /^\d//^\d/ # => nil# => nil"Miliard = 10**9""Miliard = 10**9"[[/[a-zA-z]+//[a-zA-z]+/] ] # => "Miliard"# => "Miliard"match match == "dwa i 3/4""dwa i 3/4".match.match /(\d)\/([0-9])//(\d)\/([0-9])/matchmatch.class.class # => MatchData# => MatchDatamatchmatch[[00]] # => "3/4"# => "3/4"matchmatch[[11]] # => "3"# => "3"matchmatch[[22]] # => "4"# => "4"

Page 49: DWO 2009 - Ruby

49

RubyRuby Część IVCzęść IV

Co wi kszegoś ę

Page 50: DWO 2009 - Ruby

50

RubyRuby PlikiPliki

klasa klasa FileFile

klasa klasa FindFind

FileFile.open.open(('plik.txt''plik.txt') ) dodo ||filefile|| whilewhile line line == file file.gets.gets putsputs line line endendendend

FileFile.open.open(('plik.txt''plik.txt', , 'w''w') ) dodo ||filefile|| filefile.puts.puts "Miliard!""Miliard!"endend

FindFind.find.find((ENVENV[["HOME""HOME"]]) do ) do ||pathpath|| putsputs "Katalog: "Katalog: #{#{pathpath}}"" ifif FileFile.directory?.directory?(path)(path)endend

Page 51: DWO 2009 - Ruby

51

RubyRuby MarshallingMarshalling

czyli serializacjaczyli serializacja

klasa klasa MarshalMarshal

dumpdump

loadloadsth sth == [[33, , {{:a:a =>=> 22}}, , "koniec""koniec"]]FileFile.open.open(('file.dat''file.dat', , 'w+''w+') ) dodo ||ff|| MarshalMarshal.dump.dump(sth, f) (sth, f) endend

FileFile.open.open(('file.dat''file.dat') ) dodo ||ff|| @sth@sth == MarshalMarshal.load.load(f) (f) endend

Page 52: DWO 2009 - Ruby

52

RubyRuby WątkiWątki

klasa klasa ThreadThread

współdzielą zmienne globalne i lokalne spoza blokuwspółdzielą zmienne globalne i lokalne spoza bloku

zmienne lokalne mają na wyłącznośćzmienne lokalne mają na wyłączność

Thread.listThread.list

Thread.currentThread.current

do wersji 1.8 nie były natywne :(do wersji 1.8 nie były natywne :(

… … ale w wersji 1.9 już tak :)ale w wersji 1.9 już tak :)

100100.times.times do do ||ii|| ThreadThread.new.new(i) (i) dodo ||jj|| putsputs "sqrt("sqrt(#{#{jj}}) = ) = #{#{MathMath.sqrt.sqrt(j)(j)}}"" endendendend

Page 53: DWO 2009 - Ruby

53

RubyRuby SocketsSockets

klasy:klasy: BasicSocketBasicSocket

IPSocketIPSocket TCPSocketTCPSocket

SOCKSSocketSOCKSSocket TCPServerTCPServer

UDPSocketUDPSocket SocketSocket UNIXSocketUNIXSocket

UNIXServerUNIXServer

server server == TCPServerTCPServer.new.new(('localhost''localhost', , 1234512345))looploop do do ThreadThread.start.start(server(server.accept.accept) do ) do ||ss|| ss.write.write(("Miliard!""Miliard!")) ss.close.close endendendend

client client == TCPSocketTCPSocket.new.new(("127.0.0.1""127.0.0.1", , 1234512345))putsputs client client.readline.readlineclientclient.close.close

Page 54: DWO 2009 - Ruby

54

RubyRuby Część VCzęść V

Postludium

Page 55: DWO 2009 - Ruby

55

RubyRuby Więcej!Więcej!

RubyGems – rubygems.orgRubyGems – rubygems.org

gem installgem install gem listgem list

RubyForge – rubyforge.orgRubyForge – rubyforge.org● RubyForge is a home for open source Ruby projectsRubyForge is a home for open source Ruby projects

Page 56: DWO 2009 - Ruby

56

RubyRuby Jeszcze więcej!Jeszcze więcej!

Web frameworksWeb frameworks co najmniej 10, m.in:co najmniej 10, m.in:

Ruby On RailsRuby On Rails MerbMerb

Coś do baz danychCoś do baz danych DataMapperDataMapper SequelSequel

Coś do testówCoś do testów● Test::UnitTest::Unit [w bibliotece standardowej][w bibliotece standardowej] RSpecRSpec

Ruby bindings for OpenGL and GLUTRuby bindings for OpenGL and GLUT RMagickRMagick wxRubywxRuby … … i mnóstwo innych!i mnóstwo innych!

Page 57: DWO 2009 - Ruby

57

RubyRuby Róża bez kolców?Róża bez kolców?

wątki realizowane w obrębie VM wątki realizowane w obrębie VM [nieaktualne od 1.9][nieaktualne od 1.9]

brak wsparcia dla Unicode'u brak wsparcia dla Unicode'u [nieaktualne od 1.9][nieaktualne od 1.9]

średnia wydajnośćśrednia wydajność [ale 1.9 około 2 razy szybszy niż 1.8][ale 1.9 około 2 razy szybszy niż 1.8]

brak specyfikacjibrak specyfikacji

łatwy monkey patchingłatwy monkey patching

Page 58: DWO 2009 - Ruby

58

RubyRuby ŹródłaŹródła

ruby-lang.orgruby-lang.org

rubylearning.comrubylearning.com

ruby-doc.orgruby-doc.org

rubyforge.orgrubyforge.org

rubygems.orgrubygems.org

Page 59: DWO 2009 - Ruby

59

RubyRuby KoniecKoniec

Pytania?

© Mikołaj Pastuszko