Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby's yield feature in relation to computer science

I recently discovered Ruby's blocks and yielding features, and I was wondering: where does this fit in terms of computer science theory? Is it a functional programming technique, or something more specific?

like image 218
hbw Avatar asked Apr 18 '09 20:04

hbw


People also ask

What is the use of yield in Ruby?

yield tells ruby to call the block passed to the method, giving it its argument. yield will produce an error if the method wasn't called with a block where as return statement don't produces error.

What does yield mean in programming?

In computer science, yield is an action that occurs in a computer program during multithreading, of forcing a processor to relinquish control of the current running thread, and sending it to the end of the running queue, of the same scheduling priority.

What does do in Ruby mean?

The do keyword comes into play when defining an argument for a multi-line Ruby block. Ruby blocks are anonymous functions that are enclosed in a do-end statement or curly braces {} . Usually, they are enclosed in a do-end statement if the block spans through multiple lines and {} if it's a single line block.

What is a Ruby block?

A block looks similar to a method in Ruby. Methods consist of a name, but with blocks we don't need to write a name, and always pass to a method call. Blocks are a handy and powerful feature in Ruby, and we can use them anywhere. Blocks are anonymous pieces of code that accept input from arguments and return a value.


1 Answers

Ruby's yield is not an iterator like in C# and Python. yield itself is actually a really simple concept once you understand how blocks work in Ruby.

Yes, blocks are a functional programming feature, even though Ruby is not properly a functional language. In fact, Ruby uses the method lambda to create block objects, which is borrowed from Lisp's syntax for creating anonymous functions — which is what blocks are. From a computer science standpoint, Ruby's blocks (and Lisp's lambda functions) are closures. In Ruby, methods usually take only one block. (You can pass more, but it's awkward.)

The yield keyword in Ruby is just a way of calling a block that's been given to a method. These two examples are equivalent:

def with_log   output = yield # We're calling our block here with yield   puts "Returned value is #{output}" end  def with_log(&stuff_to_do) # the & tells Ruby to convert into                            # an object without calling lambda   output = stuff_to_do.call # We're explicitly calling the block here   puts "Returned value is #{output}" end 

In the first case, we're just assuming there's a block and say to call it. In the other, Ruby wraps the block in an object and passes it as an argument. The first is more efficient and readable, but they're effectively the same. You'd call either one like this:

with_log do   a = 5   other_num = gets.to_i   @my_var = a + other_num end 

And it would print the value that wound up getting assigned to @my_var. (OK, so that's a completely stupid function, but I think you get the idea.)

Blocks are used for a lot of things in Ruby. Almost every place you'd use a loop in a language like Java, it's replaced in Ruby with methods that take blocks. For example,

[1,2,3].each {|value| print value} # prints "123" [1,2,3].map {|value| 2**value}    # returns [2, 4, 8] [1,2,3].reject {|value| value % 2 == 0} # returns [1, 3] 

As Andrew noted, it's also commonly used for opening files and many other places. Basically anytime you have a standard function that could use some custom logic (like sorting an array or processing a file), you'll use a block. There are other uses too, but this answer is already so long I'm afraid it will cause heart attacks in readers with weaker constitutions. Hopefully this clears up the confusion on this topic.

like image 148
Chuck Avatar answered Sep 20 '22 13:09

Chuck