User Tools

Site Tools


inf:ruby:eloquent

Rozdział 2

  • Tak jak if ma unless, tak i while ma until. Przykład z Railsów:
    def drain
      run(@queue.pop) until @queue.empty?
    end
  • Pętla for jest prawie taka sama jak korzystanie z metody each. Istotną różnicą jest to, że ta druga wprowadza nowy zakres zmiennych.
     > movies = %w[Ruby Java Python]
     > movies.each {|movie| i = movie}
     > i
    NameError: undefined local variable or method 'i' for main:Object
    	from (irb):3
    	from /Users/sqbell/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in '<main>'
     > for movie in movies
    ?>   z = movie
    ?> end
     > z
    => "Python" 
  • case w Rubym do porównania korzysta z operatora ===.
  • Tylko false i nil są traktowane jako false. 0 to w Rubym true.

Rozdział 3

  • Chcąc podać tablicę jako parametry do metody, możemy skorzystać z symbolu * (splat).
    parameters = ["John", "Goodman", 1952]
     
    def add_actor(name, surname, born)
      # do something
    end
     
    add_actor(*parameters)
  • map przechodzi przez kolekcję, wykonując na każdym elemencie blok kodu. Zwraca tablicę ze wszystkim, co blok zwrócił.
  • inject przekazuje do bloku dwa argumenty: element kolekcji i obecny wynik przeprowadzanej operacji (dodawania, etc.).
    [1, 2, 3].inject(0) {|result, number| result += number}
    # lub w skrócie
    [1, 2, 3].inject(:+)
    => 6
  • Hashe w Rubym 1.9 są uporządkowane - to jest ostatnio dodany element jest na końcu hasha.
  • Jeśli potrzebujemy kolekcji, która zapewnia unikalność, powinniśmy skorzystać z kolekcji set.
  • array = []; array[24566] = sqbell utworzy 24567 nowych elementów tablicy, większość których będzie równa nil.

Rozdział 5

  • /\d\d:\d\d (AM|PM)/ =~ “10:24 PM” - rezultat to 0, co oznacza, że znaleziono wzorzec pod indeksem 0. Gdy nic nie znaleziono, zwrócony zostanie nil.
  • Operator =~ działa w obie strony.
    time = '10:24 AM'
     
    puts "Mooorning's heeereeee!!!" if /AM/ =~ time
    puts "Mooorning's heeereeee!!!" if time =~ /AM/

Rozdział 6 - Symbole

  • Używając symboli w Hashach nie możemy później odwoływać się do danych wartości za pomocą Stringów. W Railsach dodano po to osobną klasę HashWithIndifferentAccess.
    person = {}
    person[:name] = 'Marek'
     
    puts "Name: #{person['name']}"
     
    person = HashWithIndifferentAccess.new
    person[:name] = 'Marek'
     
    puts "Name: #{person['name']} and #{person[:name]}"

Rozdział 7 - Obiekty

  • metody mogą być public, private, protected,
  • metody w Rubym są standardowo public,
  • metody private nie mogą być wykonywane z referencją do obiektu. (n = doc.word_count, jeśli word_count byłoby metodą private, zakończyłoby się rzuceniem wyjątku),
  • metody private mogą być wywoływane przez podklasy,
  • metodę protected można wywoływać w każdej instancji danej klasy (??),
  • metody z ograniczonym dostępem i tak mogą być uruchamiane za pomocą metody send - n = doc.send(:word_count)

Rozdział 14

  • Zamiast ustawiania getterów i setterów za każdym razem, mamy wygodną metodę attr_accessor, która zrobi to za nas.
    class Girl
      attr_accessor :height
    end

Inne

Symbol Przykład Znaczenie
%q{} str = %q{“What is up?”, she asked. “'sup you ask?”} Arbitrary quote mechanism - ograniczona interpretacja, jak z pojedynczym cudzysłowem
%Q{} str = %Q<My favorite show is #{Shows.find_by_name('Frasier')}> Interpretacja jak z podwójnym cudzysłowem
%s{}
%S{}
%r{}
%w{}
%x{}
inf/ruby/eloquent.txt · Last modified: 2021/02/16 09:56 (external edit)