Your SlideShare is downloading. ×
DWO 2009 - Ruby
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

DWO 2009 - Ruby

444
views

Published on

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

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

Published in: Technology, Education

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
444
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Ruby Ruby
  • 2. Ruby Wstęp  Kim jestem?  Kim są słuchacze?  Po co ta prezentacja?  Zainteresować językiem Ruby  Pokazać prostotę i możliwości  Objaśnić jak zacząć przygodę 2
  • 3. Ruby Plan I. Rekonesans II. Pierwszy dotyk III. wRubyWstąpienie  Konstrukcje składniowe  Typy wbudowane IV. Coś większego V. Postludium 3
  • 4. Ruby Część I Rekonesans 4
  • 5. Ruby Ruby? A co to takiego? Wzór chemiczny Al2O3:Cr+3 Gęstość 3,95 do 4,1 g/cm3 Barwa czerwona o różnych odcieniach i różnym stopniu nasycenia; niekiedy wielobarwnyRubin Luminescencja wyraźna, nadaje minerał rubinom szczególnego z gromady tlenków kolorytu, podwyższając ich walory estetyczne. 5
  • 6. Ruby Powstanie  Twórca: Yukihiro Matsumoto [Matz]  Czas powstania: rok 1995  Popularna wersja: 1.8.7 [czerwiec 2008]  Najnowsza wersja: 1.9.1 [styczeń 2009]  Czekamy na Ruby 2.0 6
  • 7. Ruby Cechy  Interpretowany [chociaż są kompilatory just-in-time]  Obiektowy  Dynamicznie typowany  Automatyczne zarządzanie pamięcią  Podobny do: Python, Smalltalk, Perl, Icon  Nie posiada specyfikacji! 7
  • 8. Ruby Implementacje  Ruby MRI – Matzs Ruby Interpreter [implementacja referencyjna]  YARV – Yet another Ruby VM [standard od wersji 1.9]  JRuby – implementacja w Javie  XRuby – kompilacja do Java bytecode  IronRuby – implementacja w .NET  MacRuby – implementacja Applea 8  Rubinius
  • 9. Ruby Część II Pierwszy dotyk 9
  • 10. Ruby Piszesz - masz for x in 5..15 print x2 end dzień dobry include dobry? abecadło each char do c print c,capitalize end 100 times do print Będę mówił rubi, a nie rabi! end 10
  • 11. Ruby Piszesz - masz for x in 5..15 print x**2 end dzień dobry.include? dobry abecadło.each_char do |c| print c.capitalize end 100.times do print "Będę mówił rubi, a nie rabi!" end 11
  • 12. Ruby Gdzie pisać?  Pliki .rb  require  load  Skrypty #!/usr/bin/env ruby ...  irb - Interactive Ruby Shell 12
  • 13. Ruby Pomocy!  RDoc  ruby-doc.org  ri  metoda help  refleksja  .methods  .inspect 13
  • 14. Ruby Część III wRubyWstąpienie 14
  • 15. Ruby Obiektowość  Wszystko jest obiektem  … nawet nil  … nawet klasa [instancja klasy Class]  “Class is an object, and Object is a class.” [Hal Fulton]  Wszystko jest wyrażeniem i zwraca wartość  Wszystko oprócz nil i false jest 15 prawdą
  • 16. Ruby Zmienne i stałe  Zmienne  od małej litery lub znaku _  słowa oddzielone znakiem _  Stałe  od dużej litery  CamelCase  Zmienne globalne  od znaku $  Symbole  od znaku : 16
  • 17. Ruby Komentarze  jednolinijkowe # Jednolinijkowy komentarz  wielolinijkowe =begin Ten komentarz nie wnosi nic konstruktywnego poza zajęciem czasu czytelnika. =end 17
  • 18. KonstrukcjeRuby składniowe  operatory  instrukcje warunkowe  pętle  metody  klasy  moduły  dziedziczenie & mixins  bloki  wyrażenia lambda  wyjątki 18
  • 19. Ruby Operatory  arytmetyczne + - * / % **  przypisania = += -= *= /= %= **= |= &= >>= <<= ||= &&=  porównania == .eql? .equal? != < > >= <= <=> =~ !~  logiczne && || ! and or not  bitowe Nie ma operatorów ++ i -- ~ | & ^ << >>  inne 19 [] []= .. … ! not
  • 20. Ruby Operatory  ==, .eql?, .equal? 5 == 5.0 # => true 5.eql? 5.0 # => false 5.equal? 5.0 # => false 5.equal? 5 # => true a == a # => true a.eql? a # => true a.equal? a # => false  || oraz or, && oraz and – różnica w priorytetach a = false or 5 # => 5, a = false a = false || 5 # => 5, a = 5 20
  • 21. Ruby Operatory  ||= a = a || "default value" a ||= "default value"  wielokrotne przypisanie a, b = b, a a, b, c = get_something 21
  • 22. InstrukcjeRuby warunkowe  if … [elsif …] [else …] end x = if a > 5 100 elsif a > 100 puts miliard! 10**9 else 1 end  … if … puts miliard! if a > 100  unless zamiast if not 22
  • 23. InstrukcjeRuby warunkowe  … ? … : ... x = a > 100 ? miliard! : mało  case … when … [else ...] end x = case x when 0...5 1 when 5..100 50 else miliard! end 23
  • 24. Ruby Pętle  while … [do] … end while a > 10 a /= 3.0 end  … while … puts "Iteracja nr #{i+=1}" while i < 10  until zamiast while not 24
  • 25. Ruby Pętle  for … in … [do] … end for i in 1..8 puts i end  break  next  redo  retry  metody na obiektach typu Integer  times  upto 25  downto
  • 26. Ruby Metody  wywołanie invoke_method invoke_method()  wywołanie z argumentami invoke_method a, b, c invoke_method(a, b, c)  wywołanie z wykorzystaniem wartości zwracanej a = invoke_method(a, b, c) puts invoke_method(a, b, c)  nawiasy opcjonalne  … ale zalecane, bo: one_method 5, another_method 10, 100 26
  • 27. Ruby Metody  definiowanie def something_interesting first_statement second_statement third_statement_will_return_sth end  return opcjonalne  … chyba że nie jest ostatnią instrukcją def something_interesting return false if $SthWrongHappened second_statement third_statement # will return sth unless $SthWrongHappened end 27
  • 28. Ruby Metody  definiowanie z argumentami def something_interesting(a, b, c) ... end  argumenty domyślne def something_interesting(a, b = true) ... end  lista argumentów def something_interesting(a, *other_args) ... end 28
  • 29. Ruby Metody - konwencje  Bang methods  zakończone znakiem !  potencjalnie niebezpieczne  np. modyfikują obiekt w miejscu  najczęściej posiadają odpowiedniki niemodyfikujące, które produkują nowe obiekty  np. sort!, upcase!, reverse! w kolekcjach  Metody pytające  zakończone znakiem ?  najczęściej zwracają true lub false  np. empty?, include?, nil? 29
  • 30. Ruby Klasy  class … end class Miliard puts "Ładowanie..."  nazwa od dużej litery  wewnątrz definicje metod attr_reader :value  … oraz instrukcje def initialize(value) @value = value  metoda initialize end  metoda inspect def introduce_yourself  zmienne instancji puts "Wartość: #{@value}"  od znaku @ end  zmienne klasy def value=(v)  od znaków @@ @value = v if v > 100 end  własne akcesory end 30  akcesory attr_reader, attr_writer, attr_accessor
  • 31. Ruby Klasy  metoda instancji class Document def send_to(email)  konwencja: ... end Klasa#metoda end d = Document.new d.send_to(darth@vader.gov) class Document  metoda klasy def self.read_from(filename) ...  konwencja: end Klasa::metoda end d = Document.read_from(dok.txt) 31
  • 32. Ruby Klasy  klasy nigdy nie są zamknięte!  można rozszerzać i modyfikować istniejące  … również wbudowane :) class String def inspect "Ukryta wartość" end def starts_with_capital? (A..Z).include?(self[0, 1]) end end 32  pojedyncze obiekty też są otwarte!
  • 33. Ruby Klasy  poziomy dostępu metod def SomeClass def some_public_method  public end  protected protected  private def some_protected_method end private def some_private_method def SomeClass end public :sth_public end protected :sth_protected private :sth_private def ... ... end 33
  • 34. Obiekty jakoRuby odbiorcy metod  każda metoda jest wysyłana do obiektu  send "abc".send("capitalize")  method_missing class Miliard def method_missing(method_id) puts "Nie mam metody #{method_id}!" end end 34
  • 35. Ruby Moduły  tworzą przestrzeń nazw module ComputingMachine PerformanceUnit = FLOPS def ComputingMachine.play_chess ... end end puts ComputingMachine::PerformanceUnit ComputingMachine.play_chess  mogą zostać włączone do innego modułu lub klasy 35
  • 36. Ruby Mixins  include module DebugAbility  można włączyć def error_info "Something bad happened..." kilka modułów end  nie można stworzyć end hierarchii class Miliard include DebugAbility ... end puts Miliard.new.error_info 36
  • 37. Ruby Dziedziczenie  tylko jednobazowe class Miliard def introduce_yourself  hierarchia klas puts "Miliard!"  Object – korzeń end end  polimorfizm class LepszyMiliard < Miliard  self def introduce_yourself  super super puts "Lepszy Miliard!"  zmienne instancji end nie są związane def to_s z klasą, ale z obiektem "Lepszy Miliard!" end end 37
  • 38. Ruby Bloki  smaczny kąsek  do … end 10.times do |i| puts i end  {…} 10.times { |i| puts i }  są przekazywane do metody  yield def give_me_something sth = rand.to_s yield(sth) end give_me_something { |x| puts "Ive got #{x}!" } 38
  • 39. Ruby Wyrażenia lambda  bloki nie są obiektami...  … ale mogą się nimi stać :)  klasa Proc  metody lambda i proc miliard = lambda { puts "Miliard!" } miliard.class # => Proc miliard.call # => "Miliard!"  nie można przekazywać metod do innych metod...  … ale można przekazywać obiekty klasy Proc  metoda nie może zwrócić innej metody... 39  … ale może zwrócić obiekt klasy Proc
  • 40. Ruby Wyjątki  przechwytywanie – rescue, ensure begin dangerous_method rescue IOError puts "Oh, no! IO Error!" rescue AnotherException => e puts "Dunno what happened 0_o", e.message ensure # here we enter always end  można też objąć całą metodę def some_method dangerous_method rescue puts "Oh, no! Error!" end 40
  • 41. Ruby Wyjątki  rzucanie - raise def dangerous_method(arg) raise Invalid argument unless arg raise ArgIsZeroError, Arg is zero if arg == 0 ... end  dziedziczą po klasie Exception  domyślnie RuntimeError 41
  • 42. Ruby Typy wbudowane  liczby  łańcuchy tekstowe [string]  zakresy  tablice  tablice asocjacyjne [hash]  wyrażenia regularne 42
  • 43. Ruby Liczby  Wbudowane  Numeric  Integer Fixnum [do 230 - 1]  ● Bignum [od 230]  Float  Biblioteczne  Numeric  Complex [liczby zespolone]  Rational [liczby wymierne] 43
  • 44. Ruby Łańcuchy tekstowe  klasa String  mutowalne  ograniczone znakami lub "  specjalne, ograniczone znakami `  wykonywane przez system operacyjny  #{ … } - tylko gdy " [string interpolation]  escape sequences – od znaku  bogaty zestaw metod  do wersji 1.8 nie obsługują natywnie Unicodeu :( 44  … ale w 1.9 już tak :)
  • 45. Ruby Zakresy  klasa Range  wyrażają sekwencje  prawostronnie domknięte  operator ..  prawostronnie otwarte  operator ... (a..g).include? r # => false (10...100) === 50 # => true (0..20).step(5).to_a # => [0, 5, 10, 15, 20] 45
  • 46. Ruby Tablice  klasa Array  mutowalne  ograniczone znakami [ i ]  mogą zawierać dowolne obiekty  bogaty zestaw metod a = [3, ["inna", "tablica"], nil, "koniec"] a[0] # => 3 a[-1] # => "koniec" a[-2, 2] # => [nil, "koniec"] a[100] # => nil a.each {|e| puts e} a.select {|e| e.class == String} # => ["koniec"] 46
  • 47. Ruby Tablice asocjacyjne  klasa Hash  klucze i wartości  brak zachowania kolejności  wyszukiwanie i wstawianie w czasie O(1)  ograniczone znakami { i }  bogaty zestaw metod h = {1 => jeden, 2 => dwa, 10 => miliard, :some_symbol => [2, 3] } h[10] # => miliard h[5] # => nil h.each_pair {|k, v| puts "#{k} = #{v}" } h.keys # => [1, 2, :some_symbol, 10] 47
  • 48. Ruby Wyrażenia regularne  klasa Regexp  wbudowane w język  ograniczone znakami /  operator =~  metoda match "dwa i 3/4" =~ /d/ # => 6 "dwa i 3/4" =~ /^d/ # => nil "Miliard = 10**9"[/[a-zA-z]+/] # => "Miliard" match = "dwa i 3/4".match /(d)/([0-9])/ match.class # => MatchData match[0] # => "3/4" match[1] # => "3" 48 match[2] # => "4"
  • 49. Ruby Część IV Coś większego 49
  • 50. Ruby Pliki  klasa File File.open(plik.txt) do |file| while line = file.gets puts line end end File.open(plik.txt, w) do |file| file.puts "Miliard!" end  klasa Find Find.find(ENV["HOME"]) do |path| puts "Katalog: #{path}" if File.directory?(path) end 50
  • 51. Ruby Marshalling  czyli serializacja  klasa Marshal  dump  load sth = [3, {:a => 2}, "koniec"] File.open(file.dat, w+) do |f| Marshal.dump(sth, f) end File.open(file.dat) do |f| @sth = Marshal.load(f) end 51
  • 52. Ruby Wątki  klasa Thread  współdzielą zmienne globalne i lokalne spoza bloku  zmienne lokalne mają na wyłączność  Thread.list  Thread.current 100.times do |i| Thread.new(i) do |j| puts "sqrt(#{j}) = #{Math.sqrt(j)}" end end  do wersji 1.8 nie były natywne :( 52  … ale w wersji 1.9 już tak :)
  • 53. Ruby Sockets  klasy: server = TCPServer.new(localhost, 12345)  BasicSocket loop do  IPSocket Thread.start(server.accept) do |s|  TCPSocket s.write("Miliard!")  SOCKSSocket s.close  TCPServer end  UDPSocket end  Socket  UNIXSocket  UNIXServer client = TCPSocket.new("127.0.0.1", 12345) puts client.readline client.close 53
  • 54. Ruby Część V Postludium 54
  • 55. Ruby Więcej!  RubyGems – rubygems.org  gem install  gem list  RubyForge – rubyforge.org ● RubyForge is a home for open source Ruby projects 55
  • 56. Ruby Jeszcze więcej!  Web frameworks  co najmniej 10, m.in:  Ruby On Rails  Merb  Coś do baz danych  DataMapper  Sequel  Coś do testów ● Test::Unit [w bibliotece standardowej]  RSpec  Ruby bindings for OpenGL and GLUT  RMagick  wxRuby 56  … i mnóstwo innych!
  • 57. Ruby Róża bez kolców?  wątki realizowane w obrębie VM [nieaktualne od 1.9]  brak wsparcia dla Unicodeu [nieaktualne od 1.9]  średnia wydajność [ale 1.9 około 2 razy szybszy niż 1.8]  brak specyfikacji  łatwy monkey patching 57
  • 58. Ruby Źródła  ruby-lang.org  rubylearning.com  ruby-doc.org  rubyforge.org  rubygems.org 58
  • 59. Ruby Koniec Pytania? 59 © Mikołaj Pastuszko