.NET (3) .rb (1) *.cod (1) 3110c (1) Algorithm (1) Amazon Cloud Drive (1) amkette (1) Android (1) Apex (6) apex:dynamic (1) API (1) API version (1) Application Development Contest (2) Artificial Intelligence (2) Atricore (1) b2g (1) Binary Search Tree (1) Blackberry Application Development (1) Blackberry Java Development Environment (1) Blender Game Engine (1) bluetooth (2) Boot2Gecko (1) bug fix (1) C (1) C++ (2) Cloud computing (1) Cloud Storage (1) Code Blocks (1) Code for a Cause (2) codejam (1) Coding (1) const_cast (1) Custom Help (1) Dancing With the Googlers (1) Data Structures (1) desktop environment (5) Doubly Linked List (1) Dropbox (1) dynamic visualforce component (1) dynamic_cast (1) Enterprise WSDL (1) Execution Context (1) fedora 14 (1) fedora 17 (5) Firefox OS (1) Flashing Nokia 3110c handset (1) (7) Gaia (1) Game Developement (1) GCC (2) GDG (2) Goank (1) Google (4) Google Developer Group (2) Google Drive (1) GTK+ (5) HACK2012 (2) Hall of Mirrors (1) help for this page (1) HTML5 (2) HTTP Web Server (1) IDE (1) Identity Provider (1) Intelligent Systems (1) Java (1) JDE (1) JOSSO (1) location based social network (1) (1) MinGW (1) Natural Language Processing (1) Natural Language Toolkit (1) neckphone (1) NLKT (1) Nokia Pheonix (1) Notebook (1) Numeric XML Tags (1) OAuth2.0 (1) OLPC (7) OLPC-XO-1 (7) One Laptop per Child (5) Override custom help (1) Paas (1) Partner WSDL (1) Polymorphism (1) programming contest (1) PyGTK (4) Python (10) Recycled Numbers (1) reinterpret_cast (1) Research (1) REST (1) RM-237 (1) Robotics (1) Ruby (1) Saas (2) (7) SDK (1) Service Provider (1) Single sign on (1) SOAP (3) Speaking in Tongues (1) SSO Agent (1) SSO Gateway (1) static_const (1) sugar (7) sugar activity (4) sugarlabs (7) SVG (2) Symbiotic AI (1) Tabbed container (1) TCP/IP (1) TCP/IP stack (1) Typecasting (1) typeid (1) ubuntu 13.10 (1) UDP (1) Upgrade Assembly (1) Visualforce (2) Web Server (1) Web Services (3) Web2.0 (1) wikipedia (1) wikipediaHI (1) WSDL (1) XML tags (1)

Saturday, April 12, 2014

Ruby Magic with Code Blocks

This week I have started learning Ruby language. I came to know that those who have are from Python background find it easy to learn as compared to those from other languages. This motivates me and pushes me to explore Ruby.

So far I have been going through Ruby Documentation. This post is specifically dedicated towards Ruby code blocks. This is a nice feature that I see unique as compared to other languages.

Ruby code blocks gives us ability to pass a block of code to be passed as a argument to a method. :)
Looks Strange.. isn't it ? I also reacted the same way !

Let's look how it works:

Consider a method:

And let's say we have single line code block as {puts "in the block"}. We can pass this single line block as a parameter to the method the same way we do it for method parameters. In order to consume the Ruby code block the method can use the "yield" method to invoke it. The beauty is that a Ruby code block can be invoked in the same way as methods are invoked.

Let's have a look on how we go about it:
In the above shown code I have added "puts" and "print" for tracking. In line #5 you can observe that we are calling "yield" with no parameters at all. This will simply call the Ruby code block that it received as parameter. In line #6 you can observe that we are calling "yield" with 10 as parameter. In this case greet method will invoke Ruby code block with 10 as one of the parameter.

Single line code blocks

Now when we pass single line Ruby code block as parameter to greet as in line #11 having simple "puts" statement we get such output:
You can observe two "in the block" statement in output. The reason behind is that we invoked yield twice within greet method. Once without parameter and once with 10 as parameter.

Multi line code blocks

Now consider when we pass multiline Ruby code block as parameter to greet as in line #13 having print statement with block parameter "x" picked dynamically from yield statement in greet method. In line #14 I have used interpolation feature of Ruby that puts the result of an expression within string literal. So this will produce such output:
You can observe the two "in the block with x=" statements with different x value. The reason behind is that we invoked yield twice within greet method. Once without parameter and once with 10 as parameter. And we used interpolation to print the value of parameter.

Capturing the response from Ruby code blocks

We can capture the response from code block in the same way we do for Ruby methods.
Lets dive for one example:
I have defined a Ruby method that captures response from yield( execution of ruby code block) into a variable named "result". We have a multiline code block at line #32. As we know Ruby methods return value in last line as return value by-default. The same funda applies to Ruby code blocks. So the value that gets returned by this code block is "2" since we mentioned it in line #34 (last line of code block). And here's the output:

No block passed within a method having yield statement

What happens if we pass no code block to a method that have a yield statement. Yes, you guessed it right ! It gives an error: LocalJumpError. Here is the small snippet showing how:

How to handle "no block given" error: We can use "block_given?" method to check whether a block is passed as param and then only invoke "yield" method. Here is the small snippet showing how:

Hope you enjoyed my first post on Ruby. Stay tuned to get more magic with Ruby !