====== Making Code Blocks With & (Ampersand) ====== Enumerable objects, such as arrays, have iterator methods which take a code block as an argument. Here's an example as it may appear in a Rails project: @users = User.find(:all) usernames = @users.collect {|user| user.login} Here, the collect method returns an array with the results of running the code block once for every user object in the @users array. The code block executes the "login" attr_reader method, so all logins are collected in an array called usernames. In Rails, there is a shortcut for this, which makes use of the ampersand: @users = User.find(:all) usernames = @users.collect &:login This code calls the login attr_reader method for each element in @users. Here, the ampersand (&) is syntactic sugar for a ''to_proc'' call on the Symbol object. This ''to_proc'' method converts the symbol into a method call. The ''to_proc'' method in Rails looks something like this: class Symbol # A generalized conversion of a method name # to a proc that runs this method. # def to_proc lambda {|x, *args| x.send(self, *args)} end end Credits: [[http://eli.thegreenplace.net/2006/04/18/understanding-ruby-blocks-procs-and-methods/|Eli Bendersky's Website]].