Wstęp do Ruby\'ego

3,318 views

Published on

Prezentacja zaprezentowana na 3 biwaku informatycznym AGH.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Wstęp do Ruby\'ego

  1. 1. Ruby Ruby
  2. 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. 3. Ruby Plan I. Rekonesans II. Pierwszy dotyk III. wRubyWstąpienie  Konstrukcje składniowe  Typy wbudowane IV. Coś większego V. Postludium 3
  4. 4. Ruby Część I Rekonesans 4
  5. 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 wielobarwny Rubin Luminescencja wyraźna, nadaje minerał rubinom szczególnego z gromady tlenków kolorytu, podwyższając ich walory estetyczne. 5
  6. 6. Ruby Powstanie  Twórca: Yukihiro Matsumoto [Matz]  Czas powstania: rok 1995  Obecna wersja: 1.8.7 [czerwiec 2008]  Kolejna wersja: 1.9.1 [styczeń 2009]  Czekamy na Ruby 2.0 6
  7. 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. 8. Ruby Implementacje  Ruby MRI – Matz's Ruby Interpreter [implementacja referencyjna]  YARV – Yet another Ruby VM [standard od wersji 1.9]  JRuby – implementacja w Javie  IronRuby – implementacja w .NET  MacRuby – implementacja Apple'a  Rubinius 8
  9. 9. Ruby Część II Pierwszy dotyk 9
  10. 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. 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 quot;Będę mówił 'rubi', a nie 'rabi'!quot; end 11
  12. 12. Ruby Gdzie pisać?  Pliki .rb  require  load  Skrypty #!/usr/bin/env ruby ...  irb - Interactive Ruby Shell 12
  13. 13. Ruby Pomocy!  RDoc  ruby-doc.org  ri  metoda help  refleksja  .methods  .inspect 13
  14. 14. Ruby Część III wRubyWstąpienie 14
  15. 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. 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. 17. Ruby Komentarze  jednolinijkowe # Jednolinijkowy komentarz  wielolinijkowe =begin Ten komentarz nie wnosi nic konstruktywnego poza zajęciem czasu czytelnika. =end 17
  18. 18. Konstrukcje Ruby składniowe  operatory  instrukcje warunkowe  pętle  metody  klasy  moduły  dziedziczenie & mixins  bloki  wyrażenia lambda  wyjątki 18
  19. 19. Ruby Operatory  arytmetyczne + - * / % **  przypisania = += -= *= /= %= **= |= &= >>= <<= ||= &&=  porównania == .eql? .equal? != < > >= <= <=> =~ !~  logiczne && || ! and or not  bitowe Nie ma operatorów ++ i -- ~ | & ^ << >>  inne 19 [] []= .. … ! not
  20. 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. 21. Ruby Operatory  ||= a = a || quot;default valuequot; a ||= quot;default valuequot;  wielokrotne przypisanie a, b = b, a a, b, c = get_something 21
  22. 22. Instrukcje Ruby 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. 23. Instrukcje Ruby 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. 24. Ruby Pętle  while … [do] … end while a > 10 a /= 3.0 end  … while … puts quot;Iteracja nr #{i+=1}quot; while i < 10  until zamiast while not 24
  25. 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. 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. 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. 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. 29. Ruby Metody - konwencje  Bang methods  zakończone znakiem !  potencjalnie 'niebezpieczne'  np. modyfikują obiekt 'w miejscu'  mogą posiadać 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. 30. Ruby Klasy  class … end class Miliard puts quot;Ładowanie...quot;  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 quot;Wartość: #{@value}quot;  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. 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. 32. Ruby Klasy  klasy nigdy nie są zamknięte!  można rozszerzać i modyfikować istniejące  … również wbudowane :) class String def inspect quot;Ukryta wartośćquot; end def starts_with_capital? ('A'..'Z').include?(self[0, 1]) end end 32  pojedyncze obiekty też są otwarte!
  33. 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. 34. Obiekty jako Ruby odbiorcy metod  każda metoda jest 'wysyłana' do obiektu  send quot;abcquot;.send(quot;capitalizequot;)  method_missing class Miliard def method_missing(method_id) puts quot;Nie mam metody #{method_id}!quot; end end 34
  35. 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. 36. Ruby Mixins  include module DebugAbility  można włączyć def error_info quot;Something bad happened...quot; kilka modułów end  nie można stworzyć end hierarchii class Miliard include DebugAbility ... end puts Miliard.new.error_info 36
  37. 37. Ruby Dziedziczenie  tylko jednobazowe class Miliard def introduce_yourself  hierarchia klas puts quot;Miliard!quot;  Object – korzeń end end  polimorfizm class LepszyMiliard < Miliard  self def introduce_yourself  super super puts quot;Lepszy Miliard!quot;  zmienne instancji end nie są związane def to_s z klasą, ale z obiektem quot;Lepszy Miliard!quot; end end 37
  38. 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 quot;I've got #{x}!quot; } 38
  39. 39. Ruby Wyrażenia lambda  bloki nie są obiektami...  … ale mogą się nimi stać :)  klasa Proc  metody lambda i proc miliard = lambda { puts quot;Miliard!quot; } miliard.class # => Proc miliard.call # => quot;Miliard!quot;  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. 40. Ruby Wyjątki  przechwytywanie – rescue, ensure begin dangerous_method rescue IOError puts quot;Oh, no! IO Error!quot; rescue AnotherException => e puts quot;Dunno what happened 0_oquot;, e.message ensure # here we enter always end  można też objąć całą metodę def some_method dangerous_method rescue puts quot;Oh, no! Error!quot; end 40
  41. 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. 42. Ruby Typy wbudowane  liczby  łańcuchy tekstowe [string]  zakresy  tablice  tablice asocjacyjne [hash]  wyrażenia regularne 42
  43. 43. Ruby Liczby  Wbudowane  Numeric  Integer Fixnum [do 230 - 1]  ● Bignum [od 230]  Float  Biblioteczne  Numeric  Complex [liczby zespolone]  Rational [liczby wymierne] 43
  44. 44. Ruby Łańcuchy tekstowe  klasa String  mutowalne  ograniczone znakami ' lub quot;  specjalne, ograniczone znakami `  wykonywane przez system operacyjny  #{ … } - tylko gdy quot; [string interpolation]  escape sequences – od znaku  bogaty zestaw metod  do wersji 1.8 nie obsługują natywnie Unicode'u :( 44  … ale w 1.9 już tak :)
  45. 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. 46. Ruby Tablice  klasa Array  mutowalne  ograniczone znakami [ i ]  mogą zawierać dowolne obiekty  bogaty zestaw metod a = [3, [quot;innaquot;, quot;tablicaquot;], nil, quot;koniecquot;] a[0] # => 3 a[-1] # => quot;koniecquot; a[-2, 2] # => [nil, quot;koniecquot;] a[100] # => nil a.each {|e| puts e} a.select {|e| e.class == String} # => [quot;koniecquot;] 46
  47. 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 quot;#{k} = #{v}quot; } h.keys # => [1, 2, :some_symbol, 10] 47
  48. 48. Ruby Wyrażenia regularne  klasa Regexp  wbudowane w język  ograniczone znakami /  operator =~  metoda match quot;dwa i 3/4quot; =~ /d/ # => 6 quot;dwa i 3/4quot; =~ /^d/ # => nil quot;Miliard = 10**9quot;[/[a-zA-z]+/] # => quot;Miliardquot; match = quot;dwa i 3/4quot;.match /(d)/([0-9])/ match.class # => MatchData match[0] # => quot;3/4quot; match[1] # => quot;3quot; 48 match[2] # => quot;4quot;
  49. 49. Ruby Część IV Coś większego 49
  50. 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 quot;Miliard!quot; end  klasa Find Find.find(ENV[quot;HOMEquot;]) do |path| puts quot;Katalog: #{path}quot; if File.directory?(path) end 50
  51. 51. Ruby Marshalling  czyli serializacja  klasa Marshal  dump  load sth = [3, {:a => 2}, quot;koniecquot;] 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. 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 quot;sqrt(#{j}) = #{Math.sqrt(j)}quot; end end  nie są natywne :( 52  … ale w wersji 1.9 już tak :)
  53. 53. Ruby Sockets  klasy: server = TCPServer.new('localhost', 12345)  BasicSocket loop do  IPSocket Thread.start(server.accept) do |s|  TCPSocket s.write(quot;Miliard!quot;)  SOCKSSocket s.close  TCPServer end  UDPSocket end  Socket  UNIXSocket  UNIXServer client = TCPSocket.new(quot;127.0.0.1quot;, 12345) puts client.readline client.close 53
  54. 54. Ruby Część V Postludium 54
  55. 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. 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. 57. Ruby Róża bez kolców?  wątki realizowane w obrębie VM [nieaktualne od 1.9]  brak wsparcia dla Unicode'u [nieaktualne od 1.9]  wolniejszy niż większość języków  brak specyfikacji 57
  58. 58. Ruby Źródła  ruby-lang.org  rubylearning.com  ruby-doc.org  rubyforge.org  rubygems.org 58
  59. 59. Ruby Koniec Pytania? …a za tydzień Erlang i Haskell ! 59 © Mikołaj Pastuszko

×