inf:ruby:blocks
Podstawowe informacje
- blok jest zapisywany jako ostatni parametr metody. Blok jest zawarty pomiędzy klamrami lub w konstrukcji
doienddef 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 obiektuProci 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ą,
inf/ruby/blocks.txt · Last modified: 2021/02/16 09:56 by 127.0.0.1
