wstęp do ruby\'ego

59
Ruby Ruby Ruby

Upload: konryd

Post on 03-Jul-2015

2.935 views

Category:

Technology


4 download

DESCRIPTION

Prezentacja zaprezentowana na 3 biwaku informatycznym AGH.

TRANSCRIPT

Page 1: Wstęp do Ruby\'ego

RubyRuby

Ruby

Page 2: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

4

RubyRuby Część ICzęść I

Rekonesans

Page 5: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

6

RubyRuby PowstaniePowstanie

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

Czas powstania:Czas powstania: rok 1995 rok 1995 Obecna wersja: 1.8.7Obecna wersja: 1.8.7

[czerwiec 2008][czerwiec 2008]

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

Czekamy na Ruby 2.0Czekamy na Ruby 2.0

Page 7: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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 IronRuby – implementacja w .NETIronRuby – implementacja w .NET MacRuby – implementacja Apple'aMacRuby – implementacja Apple'a RubiniusRubinius

Page 9: Wstęp do Ruby\'ego

9

RubyRuby Część IICzęść II

Pierwszy dotyk

Page 10: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

13

RubyRuby Pomocy!Pomocy!

RDocRDoc ruby-doc.orgruby-doc.org riri

metoda metoda helphelp refleksjarefleksja

.methods.methods .inspect.inspect

Page 14: Wstęp do Ruby\'ego

14

RubyRuby Część IIICzęść III

wRubyWst pienieą

Page 15: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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' mogą posiadać odpowiedniki niemodyfikujące, które mogą posiadać odpowiedniki niemodyfikujące, które

produkują nowe obiektyprodukują 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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

49

RubyRuby Część IVCzęść IV

Co wi kszegoś ę

Page 50: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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

nie są natywne :(nie są 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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

54

RubyRuby Część VCzęść V

Postludium

Page 55: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

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]

wolniejszy niż większość językówwolniejszy niż większość języków

brak specyfikacjibrak specyfikacji

Page 58: Wstęp do Ruby\'ego

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: Wstęp do Ruby\'ego

59

RubyRuby KoniecKoniec

Pytania?

…a za tydzie ń Erlang i Haskell !

© Mikołaj Pastuszko