Upload
konryd
View
2.935
Download
4
Embed Size (px)
DESCRIPTION
Prezentacja zaprezentowana na 3 biwaku informatycznym AGH.
Citation preview
RubyRuby
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ę
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
4
RubyRuby Część ICzęść I
Rekonesans
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
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
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!
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
9
RubyRuby Część IICzęść II
Pierwszy dotyk
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
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
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
......
13
RubyRuby Pomocy!Pomocy!
RDocRDoc ruby-doc.orgruby-doc.org riri
metoda metoda helphelp refleksjarefleksja
.methods.methods .inspect.inspect
14
RubyRuby Część IIICzęść III
wRubyWst pienieą
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ą
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 ::
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
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
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 --
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
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
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
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
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
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
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
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
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
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?
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
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]'))
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
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
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"))
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
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
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
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}}!"!" }}
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!"
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
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
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
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]
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 :)
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]
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"]
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]
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"
49
RubyRuby Część IVCzęść IV
Co wi kszegoś ę
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
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
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
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
54
RubyRuby Część VCzęść V
Postludium
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
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!
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
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
59
RubyRuby KoniecKoniec
Pytania?
…a za tydzie ń Erlang i Haskell !
© Mikołaj Pastuszko