User Tools

Site Tools


inf:ruby:blocks

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ą,
inf/ruby/blocks.txt · Last modified: 2021/02/16 09:56 (external edit)