module CustomEnumerable def my_each () # your code here! for i in 0...self.length yield(self[i]) end end end class Array include CustomEnumerable end [1,2,3,4].my_each { |i| puts i } # => 1 2 3 4 [1,2,3,4].my_each { |i| puts i * 10 } # => 10 20 30 40# yield calls a passed block (anonymous function) passed to the method def some_method puts "Before caling the block" yield puts "After calling the block" end # if a method yields and there was no block # an error is raised some_method #=> no block given (yield) (LocalJumpError) # Here is a shortened syntax of passing a block some_method { puts "Hello from the block" } #=> Before caling the block #=> Hello from the block #=> After caling the block # Here is the longer syntax of passing a block some_method do puts "Hello from the block" end # You can use the `block_given?` method to # determine whether a block is present def method_with_optional_block puts "Before caling the block" yield if block_given? puts "After calling the block" end # No error is raised when no block has been passed method_with_optional_block #=> Before caling the block #=> After caling the block method_with_optional_block { puts "Hello" } #=> Before caling the block #=> Hello #=> After caling the block # You can also capture the block as a `Proc` def method_with_proc_block(&block) # same thing as `yield if block_given?` block.call if block # You can forward the passed block to another method some_method(&block) end