SlideShare uma empresa Scribd logo
1 de 59
Baixar para ler offline
Ruby




       Ruby
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
Ruby             Plan

 I. Rekonesans
 II. Pierwszy dotyk
 III. wRubyWstąpienie
    Konstrukcje składniowe
    Typy wbudowane


 IV. Coś większego
 V. Postludium
                              3
Ruby     Część I




       Rekonesans


                    4
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
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
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
Ruby            Implementacje

    Ruby MRI – Matz's 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 Apple'a
                                                  8
    Rubinius
Ruby       Część II




       Pierwszy dotyk


                        9
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
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
Ruby             Gdzie pisać?

    Pliki .rb
      require
      load


    Skrypty      #!/usr/bin/env ruby

                  ...




    irb - Interactive Ruby Shell
                                        12
Ruby                Pomocy!

    RDoc
      ruby-doc.org
      ri


    metoda help
    refleksja
        .methods
        .inspect
                              13
Ruby       Część III




       wRubyWstąpienie


                         14
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ą
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
Ruby                Komentarze

    jednolinijkowe
     # Jednolinijkowy komentarz




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

                                         17
Konstrukcje
Ruby
                   składniowe
    operatory
    instrukcje warunkowe
    pętle
    metody
    klasy
    moduły
    dziedziczenie & mixins
    bloki
    wyrażenia lambda
    wyjątki                     18
Ruby                Operatory
    arytmetyczne
     + - * / % **
    przypisania
     = += -= *= /= %= **= |= &= >>= <<=
     ||= &&=
    porównania
     == .eql? .equal? != < > >= <= <=> =~ !~
    logiczne
     && || ! and or not
    bitowe                  Nie ma operatorów ++ i --
     ~ | & ^ << >>
    inne
                                                       19
     [] []= .. … ! not
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
Ruby                 Operatory
    ||=

     a = a || "default value"

     a ||= "default value"


    wielokrotne przypisanie

     a, b = b, a

     a, b, c = get_something



                                 21
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
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
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
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
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
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
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
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
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
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
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!
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
Obiekty jako
Ruby
                  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
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
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
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
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 "I've got #{x}!" }
                                                          38
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
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
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
Ruby           Typy wbudowane

    liczby
    łańcuchy tekstowe [string]
    zakresy
    tablice
    tablice asocjacyjne [hash]
    wyrażenia regularne




                                  42
Ruby                       Liczby

    Wbudowane
        Numeric
            Integer
              Fixnum [do 230 - 1]
              


            ●
              Bignum [od 230]
          Float
    Biblioteczne
        Numeric
            Complex [liczby zespolone]
            Rational [liczby wymierne]
                                          43
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 Unicode'u :(
                                                            44
    … ale w 1.9 już tak :)
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
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
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
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"
Ruby      Część IV




       Coś większego


                       49
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
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
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 :)
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
Ruby     Część V




       Postludium


                    54
Ruby                    Więcej!

    RubyGems – rubygems.org
        gem install
        gem list
    RubyForge – rubyforge.org
     ●   RubyForge is a home for open source Ruby projects




                                                         55
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!
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]

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

    brak specyfikacji
    łatwy monkey patching




                                                                   57
Ruby                 Źródła

    ruby-lang.org
    rubylearning.com
    ruby-doc.org
    rubyforge.org
    rubygems.org




                              58
Ruby    Koniec



       Pytania?



                              59

        © Mikołaj Pastuszko

Mais conteúdo relacionado

Destaque

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
ThinkNow
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
 

Destaque (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

DWO 2009 - Ruby

  • 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 wielobarwny Rubin 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 – Matz's 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 Apple'a 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. Konstrukcje Ruby 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. 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. 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. 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 jako Ruby 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 "I've 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 Unicode'u :( 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 Unicode'u [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