Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can someone explain Ruby's use of pipe characters in a block?

Tags:

ruby

pipe

block

Can someone explain to me Ruby's use of pipe characters in a block? I understand that it contains a variable name that will be assigned the data as it iterates. But what is this called? Can there be more than one variable inside the pipes? Anything else I should know about it? Any good links to more information on it?

For example:

25.times { | i | puts i } 
like image 457
Josh Curren Avatar asked Nov 21 '10 21:11

Josh Curren


People also ask

What does the pipe symbol mean in Ruby?

each is a method that accepts a block of code then runs that block of code for every element in a list, and the bit between do and end is just such a block. A block is like an anonymous function or lambda . The variable between pipe characters is the parameter for this block.

What are Ruby blocks explain with example?

You assign a name to a block. The code in the block is always enclosed within braces ({}). A block is always invoked from a function with the same name as that of the block. This means that if you have a block with the name test, then you use the function test to invoke this block.

Why we use blocks in Ruby?

Since Ruby blocks can access variables declared outside the block body, our total method is able to use each with a block to update the amount variable. The amount variable is set to 0 , and then each is called on the array. Each of the values in the array is passed to the block.

What is block given in Ruby?

Ruby blocks are little anonymous functions that can be passed into methods. Blocks are enclosed in a do / end statement or between brackets {} , and they can have multiple arguments.


1 Answers

Braces define an anonymous function, called a block. Tokens between the pipe are the arguments of this block. The number of arguments required depends on how the block is used. Each time the block is evaluated, the method requiring the block will pass a value based on the object calling it.

It's the same as defining a method, only it's not stored beyond the method that accepts a block.

For example:

def my_print(i)    puts i end 

will do the same as this when executed:

{|i| puts i} 

the only difference is the block is defined on the fly and not stored.

Example 2: The following statements are equivalent

25.times &method(:my_print)  25.times {|i| puts i} 

We use anonymous blocks because the majority of functions passed as a block are usually specific to your situation and not worth defining for reuse.

So what happens when a method accepts a block? That depends on the method. Methods that accept a block will call it by passing values from their calling object in a well defined manner. What's returned depends on the method requiring the block.

For example: In 25.times {|i| puts i} .times calls the block once for each value between 0 and the value of its caller, passing the value into the block as the temporary variable i. Times returns the value of the calling object. In this case 25.

Let's look at method that accepts a block with two arguments.

{:key1 => "value1", :key2 => "value2"}.each {|key,value|       puts "This key is: #{key}. Its value is #{value}" } 

In this case each calls the block ones for each key/value pair passing the key as the first argument and the value as the second argument.

like image 129
EmFi Avatar answered Sep 20 '22 17:09

EmFi