====== 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{}'' | | |