====== Podstawowe informacje ======
* blok jest zapisywany jako ostatni parametr metody. Blok jest zawarty pomiędzy klamrami lub w konstrukcji ''do'' i ''end''
def iLikeYou
yield
yield
yield
end
iLikeYou { puts "I like you, Marek!"}
# Output
I like you, Marek!
I like you, Marek!
I like you, Marek!
* kod w bloku nie jest wykonywany przy parsowaniu parametrów, lecz później, w trakcie działania metody,
* metody, które nie oczekują bloku, zignorują go,
* w metodzie, kod bloku może być wykonany za pomocą polecenia ''yield'',
* metody, które potrzebują referencji do bloku, są definiowane z ostatnim parametrem, do którego dodany jest znak ''&''. Tak zdefiniowana metoda może dostać się do bloku jako obiektu ''Proc'' i go wykonać za pomocą ''Proc#call'':
def iLikeYou(&block)
ladies = %w[Olivia Jennifer Katherine Jane]
block.call ladies.sample if block_given?
end
iLikeYou { |lady| puts "#{lady} likes you, Marek"}
# Output
Katherine likes you, Marek
* po zakończeniu wykonywania bloku, metoda jest wykonywana od miejsca, w którym znajduje się ''yield'',
* do bloku można wysyłać parametry:
def iLikeYou
likable_person = "Krzysztof"
yield likable_person
end
iLikeYou { |person| puts "I like you, #{person}!"}
# Output
I like you, Krzysztof!
* jeśli do bloku prześlemy więcej parametrów niż akceptuje, zamienione zostaną w tablicę, a przy okazji wyświetlone zostanie ostrzeżenie:
def iLikeYou
likable_person = "Krzysztof"
likable_person_from_Knurow = "Marek"
yield likable_person, likable_person_from_Knurow
end
iLikeYou { |person| puts person.class}
# Output
/Users/sqbell/Workspace/ruby/others/blocks.rb:8: warning: multiple values for a block parameter (2 for 1)
from /Users/sqbell/Workspace/ruby/others/blocks.rb:5
Array
* blok może zwrócić wartość do metody:
ladies = %w[Olivia Jennifer Katherine Jane]
def iLikeYou
number_of_ladies = 2
ladies = yield number_of_ladies
puts "#{ladies.join(" and ")} like you, Marek!"
end
iLikeYou { |number| ladies.sample(number) }
# Output
Jennifer and Olivia like you, Marek!
* bloki często używane są tam, gdzie część kodu musi zostać wykonana pod jakąś blokadą, transakcją,