====== 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 '
' > 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'' | Interpretacja jak z podwójnym cudzysłowem | | ''%s{}'' | | | | ''%S{}'' | | | | ''%r{}'' | | | | ''%w{}'' | | | | ''%x{}'' | | |