<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Sai Krishna</title>
    <description>The latest articles on Forem by Sai Krishna (@krrish96).</description>
    <link>https://forem.com/krrish96</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F302180%2F7aaabfe4-1c59-4667-a25f-0f50a8159ca4.jpg</url>
      <title>Forem: Sai Krishna</title>
      <link>https://forem.com/krrish96</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/krrish96"/>
    <language>en</language>
    <item>
      <title>Launching Portfolio 🥳 🎊 🎉</title>
      <dc:creator>Sai Krishna</dc:creator>
      <pubDate>Sun, 26 Jul 2020 12:45:23 +0000</pubDate>
      <link>https://forem.com/krrish96/launching-portfolio-55ho</link>
      <guid>https://forem.com/krrish96/launching-portfolio-55ho</guid>
      <description>&lt;p&gt;Finally launched my personal website and blog, designed and developed myself. Built with Gatsby, React and flavor of SASS&lt;/p&gt;

&lt;p&gt;&lt;a href="https://saikrishna.dev"&gt;saikrishna.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would love the DEVCommunity Feedback/Suggestions ❤️&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>gatsby</category>
      <category>saas</category>
      <category>react</category>
    </item>
    <item>
      <title>What's your checklist and suggestions for starting a new tech project/blog?</title>
      <dc:creator>Sai Krishna</dc:creator>
      <pubDate>Tue, 26 May 2020 02:56:14 +0000</pubDate>
      <link>https://forem.com/krrish96/what-s-your-checklist-and-suggestions-for-starting-a-new-tech-project-blog-1d0o</link>
      <guid>https://forem.com/krrish96/what-s-your-checklist-and-suggestions-for-starting-a-new-tech-project-blog-1d0o</guid>
      <description>&lt;p&gt;I am working on a blog post that details the do's, dont's and provides few tips for starting a new tech project/blog - to help boost confidence for those with imposter syndrome or feel they have it(like me 😉) and scrap the projects in the initial phase itself.&lt;/p&gt;

&lt;p&gt;I thought it would be best for the readers to add in the community input which is a vast knowledge.&lt;/p&gt;

&lt;p&gt;I will give you the credits by linking your profile. I respect your privacy, if you would like to stay anonymous, please mention so by adding &lt;code&gt;anonymous: true&lt;/code&gt; at the end of your comment.&lt;/p&gt;

&lt;p&gt;Thank you so much for helping me and the community.&lt;br&gt;
Cheers!&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>career</category>
      <category>sideprojects</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Do you feel more productive at the office or at home? Why?</title>
      <dc:creator>Sai Krishna</dc:creator>
      <pubDate>Mon, 25 May 2020 07:51:41 +0000</pubDate>
      <link>https://forem.com/krrish96/do-you-feel-more-productive-at-the-office-or-at-home-why-h95</link>
      <guid>https://forem.com/krrish96/do-you-feel-more-productive-at-the-office-or-at-home-why-h95</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Cover Image: Google maps &lt;a href="https://www.google.com/maps/place/Codebrahma/@12.9864289,77.7355892,3a,96.4y,90t/data=!3m8!1e2!3m6!1sAF1QipNmmbkDJiuYYfcBQG0Uf6EeJMTWECCpS5ZHAYnQ!2e10!3e12!6shttps:%2F%2Flh5.googleusercontent.com%2Fp%2FAF1QipNmmbkDJiuYYfcBQG0Uf6EeJMTWECCpS5ZHAYnQ%3Dw203-h113-k-no!7i960!8i539!4m14!1m6!3m5!1s0x3bae16a3f3bb200f:0xa889ea33ec3ddae6!2sCodebrahma!8m2!3d12.9860335!4d77.7355688!3m6!1s0x3bae16a3f3bb200f:0xa889ea33ec3ddae6!8m2!3d12.9860335!4d77.7355688!14m1!1BCgIgAQ"&gt;page&lt;/a&gt; of the organization I work for, &lt;a href="https://codebrahma.com"&gt;Codebrahma&lt;/a&gt; - I miss this beautiful view.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's been more than 2 months since most of us started work from home.&lt;/p&gt;

&lt;p&gt;I am not feeling much difference in my productivity, maybe because my travel time was less (15-20min) and I go by bicycle which I am now compensating for by walking.&lt;/p&gt;

&lt;p&gt;For those who are spending hours on road especially with Bangalore's traffic, WFH must be great and a little relaxing.&lt;/p&gt;

&lt;p&gt;I am definitely missing coffee time and Table Tennis and a lot of other fun activities at the office. And yeah I definitely miss my wonderful colleagues.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
      <category>workfromhome</category>
    </item>
    <item>
      <title>How to Smoothly Render Images in React App?</title>
      <dc:creator>Sai Krishna</dc:creator>
      <pubDate>Mon, 09 Mar 2020 05:00:23 +0000</pubDate>
      <link>https://forem.com/krrish96/how-to-smoothly-render-images-in-react-app-201j</link>
      <guid>https://forem.com/krrish96/how-to-smoothly-render-images-in-react-app-201j</guid>
      <description>&lt;p&gt;Improve your web apps UX by enhancing image render with React's &lt;code&gt;onLoad&lt;/code&gt; event and simple SCSS.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This article is cross-posted on &lt;a href="https://codebrahma.com/how-to-smoothly-render-images-in-react-app/" rel="noopener noreferrer"&gt;Codebrahma&lt;/a&gt; and &lt;a href="https://medium.com/@krrish96/how-to-smoothly-render-images-in-react-app-3110b9de15c9?source=friends_link&amp;amp;sk=3f6f6d91bd36b71b677788be61a96ae9" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's cut to the chase. The GIF below shows what we are going to achieve by the end of this post.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1svw6ve8lqh6eax9cgcj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1svw6ve8lqh6eax9cgcj.gif" alt="Default Image Rendering vs Smooth Image Rendering using render-smooth-image-react"&gt;&lt;/a&gt;&lt;/p&gt;
Default Image Rendering vs Smooth Image Rendering using &lt;a href="https://www.npmjs.com/package/render-smooth-image-react" rel="noopener noreferrer"&gt;render-smooth-image-react&lt;/a&gt;



&lt;p&gt;Here is the Completed Component - &lt;code&gt;RenderSmoothImage&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
Final Code — RenderSmoothImage — React Component




&lt;p&gt;I have published this as an &lt;code&gt;npm&lt;/code&gt; package &lt;a href="https://www.npmjs.com/package/render-smooth-image-react" rel="noopener noreferrer"&gt;render-smooth-image-react&lt;/a&gt;. The source code is available on &lt;a href="https://github.com/KRRISH96/render-smooth-image-react" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Little Back Story&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I recently started working on a media-heavy app. Everything was cool until I noticed a bunch of images rendering poorly. Which looked something like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4jffgawbo06trncm47bs.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4jffgawbo06trncm47bs.gif" alt="Example: Poor image rendering (printing)"&gt;&lt;/a&gt;&lt;/p&gt;
Example: Poor image rendering (printing)



&lt;p&gt;For a moment I thought, “Did I end up building a 🖨 &lt;em&gt;printer simulator app&lt;/em&gt;?”&lt;/p&gt;

&lt;p&gt;Overall customer satisfaction will take a hit with such poor loading UX (even if the rest of the app is great). This is especially true for media-heavy apps.&lt;/p&gt;

&lt;p&gt;Alright, Let’s see what we can do to fix this.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Load and Fire&lt;/strong&gt; 🔫
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Let the browser download the image and render it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The perfect moment to render an image is after downloading completely. Till then we just show a loader/placeholder and hide the image.&lt;/p&gt;

&lt;p&gt;We can achieve this by using React’s &lt;a href="https://reactjs.org/docs/events.html#image-events" rel="noopener noreferrer"&gt;onLoad&lt;/a&gt; event on the image tag. You can read more about &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React.js&lt;/a&gt;  events &lt;a href="https://reactjs.org/docs/events.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;onLoad=&lt;/span&gt;&lt;span class="s"&gt;{'callbackAfterImageIsDownloaded'}&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Code it&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We will create a functional component and use hooks to maintain a couple of states. If you are new to React Hooks, You can learn more &lt;a href="https://reactjs.org/docs/hooks-intro.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// RenderSmoothImage.jsx&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RenderSmoothImage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;imageLoaded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setImageLoaded&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"smooth-image-wrapper"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt;
          &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`smooth-image image-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
            &lt;span class="nx"&gt;imageLoaded&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hidden&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;onLoad&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setImageLoaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;imageLoaded&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"smooth-preloader"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"loader"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/** styles.css */&lt;/span&gt;

  &lt;span class="nc"&gt;.smooth-image&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt; &lt;span class="m"&gt;1s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.image-visible&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.image-hidden&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we maintain a state &lt;code&gt;imageLoaded&lt;/code&gt; defaults to &lt;code&gt;false&lt;/code&gt;. Which will then be set to &lt;code&gt;true&lt;/code&gt;, once the image is downloaded. We use the &lt;code&gt;onLoad&lt;/code&gt; event to trigger this.&lt;/p&gt;

&lt;p&gt;Then we use &lt;code&gt;imageLoaded&lt;/code&gt; state to conditionally add classes to the &lt;code&gt;img&lt;/code&gt; tag, &lt;code&gt;image-visible&lt;/code&gt; vs &lt;code&gt;image-hidden&lt;/code&gt;. We can add transitions/animations to make it smoother. Please refer to the linked Gist at the top for complete styles.&lt;/p&gt;

&lt;p&gt;That’s it! No more printer simulators on the page.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;What if Image Download Fails / Invalid Src?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fett00jm3yvkn4ci7ko6w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fett00jm3yvkn4ci7ko6w.png" alt="Image for alternate text with image tag"&gt;&lt;/a&gt;&lt;/p&gt;
Image for alternate text with image tag



&lt;p&gt;By using the &lt;code&gt;alt&lt;/code&gt; attribute we can show alternate text for the image. However, the default icon and styling isn’t too great. To fix this we can display custom &lt;code&gt;alt&lt;/code&gt; text.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// RenderSmoothImage.jsx&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RenderSmoothImage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;.....&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isValidSrc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsValidSrc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"smooth-image-wrapper"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isValidSrc&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt;
            &lt;span class="err"&gt;....&lt;/span&gt;
            &lt;span class="na"&gt;onError&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setIsValidSrc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"smooth-no-image"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isValidSrc&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;imageLoaded&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"smooth-preloader"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"loader"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;    &lt;span class="c"&gt;/** styles.css */&lt;/span&gt;
    &lt;span class="o"&gt;......&lt;/span&gt;
    &lt;span class="nc"&gt;.smooth-no-image&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;90deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;#999&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There you go,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdr3ugd8u7veu2d1vg57l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdr3ugd8u7veu2d1vg57l.png" alt="Customized Alternate Text for Image"&gt;&lt;/a&gt;&lt;/p&gt;
Customized Alternate Text for Image



&lt;p&gt;You can style the Alternative text any way you want.&lt;/p&gt;

&lt;p&gt;I made things easy for you and published a light-weight npm package &lt;a href="https://www.npmjs.com/package/render-smooth-image-react" rel="noopener noreferrer"&gt;render-smooth-image-react&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you for reading this post, This is &lt;a href="https://www.linkedin.com/in/kskp1996" rel="noopener noreferrer"&gt;Sai Krishna Prasad&lt;/a&gt;, a self-taught and passionate web developer. Signing off Bubye….. until next time.&lt;/p&gt;

</description>
      <category>react</category>
      <category>ux</category>
      <category>webdev</category>
      <category>css</category>
    </item>
    <item>
      <title>Understanding Procs, Lambdas, and Blocks in Ruby - Part 2: All Why?s Explained</title>
      <dc:creator>Sai Krishna</dc:creator>
      <pubDate>Mon, 24 Feb 2020 12:46:09 +0000</pubDate>
      <link>https://forem.com/krrish96/understanding-procs-lambdas-and-blocks-in-ruby-part-2-all-why-s-explained-3h8j</link>
      <guid>https://forem.com/krrish96/understanding-procs-lambdas-and-blocks-in-ruby-part-2-all-why-s-explained-3h8j</guid>
      <description>&lt;p&gt;In the first part of this article, We learned about what Procs, Lambdas, and Blocks are? If you haven’t read it, I strongly recommend you to read &lt;a href="https://dev.to/krrish96/understanding-procs-lambdas-and-blocks-in-ruby-part-1-all-what-s-answered-8ii"&gt;Part 1: All what?s Answered&lt;/a&gt;, before continuing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T5khXT5r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AJwBJK_K8uFyWKHvwlSZkzQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T5khXT5r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AJwBJK_K8uFyWKHvwlSZkzQ.jpeg" alt="Spiderman Meme - Cool story. But, What's your point?" width="600" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this part, let’s explore why we need Procs, Lambdas, and Blocks in the first place and how helpful using them with few examples and use cases.&lt;/p&gt;

&lt;p&gt;Let’s get started…&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why Blocks?&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Recap&lt;/strong&gt;: &lt;em&gt;A block is a piece of a code that is either enclosed within curly braces &lt;code&gt;{}&lt;/code&gt; or a &lt;code&gt;do..end&lt;/code&gt;. It is similar to a method but neither belongs to any object nor it has a name.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To answer why blocks? and to understand the necessity of using them, we should answer one more question — Can the &lt;em&gt;identifier/reference&lt;/em&gt; of the ruby method be used as a &lt;em&gt;first-class&lt;/em&gt; value or passed with no additional action?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No&lt;/strong&gt;. Ruby methods are not &lt;a href="https://en.wikipedia.org/wiki/First-class_function"&gt;First-Class Functions&lt;/a&gt; unlike in few other languages, say Javascript.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The identifier of a regular “function” in Ruby (which is really a method) cannot be used as a value or passed. It must first be retrieved into a &lt;code&gt;Method&lt;/code&gt; or &lt;code&gt;Proc&lt;/code&gt; object to be used as &lt;code&gt;first-class&lt;/code&gt; data. — &lt;a href="https://en.wikipedia.org/wiki/First-class_function"&gt;wiki&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To be used as a first-class value, It must first be captured into a Method or Proc object first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="c1"&gt;# Retrieving method reference into Method object&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;some_method&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Called by Reference"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;method_reference&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:some_method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;# &amp;lt;Method: main.some_method&amp;gt;&lt;/span&gt;

  &lt;span class="c1"&gt;# Calling the method using its reference&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;some_other_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method_ref_argument&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Do something before&lt;/span&gt;
    &lt;span class="n"&gt;method_ref_argument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;
    &lt;span class="c1"&gt;# Do some other things&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;some_other_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method_reference&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;# returns "Called by Reference"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the other hand, Blocks can be created “&lt;strong&gt;on the go&lt;/strong&gt;” and we need not worry about reference. Let’s try to achieve the same as above with blocks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="c1"&gt;# Block - No method reference capturing bullsh*t&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;some_other_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block_argument&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Do something before&lt;/span&gt;
    &lt;span class="n"&gt;block_argument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;
    &lt;span class="c1"&gt;# Do some other things&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;some_other_method&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am Block! and you are?"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;# returns "I am Block! and you are?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this approach, we do not need to create a method each time we want some custom things to happen in different methods.&lt;/p&gt;

&lt;p&gt;Well, can blocks be assigned/referenced at all? &lt;strong&gt;Yes&lt;/strong&gt;, which we call as &lt;code&gt;procs&lt;/code&gt; and &lt;code&gt;lambdas&lt;/code&gt; — don’t worry about this now, we will discuss in later sections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; If you are curious about the &lt;code&gt;&amp;amp;&lt;/code&gt; symbol prepended to the method argument, here is a beautifully written &lt;a href="https://ablogaboutcode.com/2012/01/04/the-ampersand-operator-in-ruby"&gt;article&lt;/a&gt; that explains it.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Do you have a point?&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;One method can be made to work in different means by injecting some custom code within the method from outside.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In other words, Using the block gives back control to the programmer.&lt;/p&gt;

&lt;p&gt;Let’s take a simple use-case…&lt;/p&gt;

&lt;p&gt;A Customer Support System for a service provider, to manage support tickets that are raised by customers. Let’s just focus on ticket status and ignore other features.&lt;/p&gt;

&lt;p&gt;A Ticket has one among open, on_hold or closed status. We have an API endpoint to mark the respective status for the tickets.&lt;/p&gt;

&lt;p&gt;Usually, in our controller, we implement as below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TicketsController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
    &lt;span class="o"&gt;.....&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mark_open&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@ticket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;status: &lt;/span&gt;&lt;span class="s2"&gt;"open"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# request response logic&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="c1"&gt;# error handler&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mark_on_hold&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@ticket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;status: &lt;/span&gt;&lt;span class="s2"&gt;"on_hold"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# request response logic&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="c1"&gt;# error handler&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mark_closed&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@ticket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;status: &lt;/span&gt;&lt;span class="s2"&gt;"closed"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# request response logic&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="c1"&gt;# error handler&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="o"&gt;......&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can notice the repeated code for each method to handle the response and errors. The primary action of these methods is to update status let alone handle requests and responses.&lt;/p&gt;

&lt;p&gt;By using blocks we can abstract the request-response and error handling to a new method keeping the actions clean and more readable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TicketsController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
    &lt;span class="o"&gt;.....&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mark_open&lt;/span&gt;
      &lt;span class="n"&gt;status_manager&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="vi"&gt;@ticket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;status: &lt;/span&gt;&lt;span class="s2"&gt;"open"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mark_on_hold&lt;/span&gt;
      &lt;span class="n"&gt;status_manager&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="vi"&gt;@ticket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;status: &lt;/span&gt;&lt;span class="s2"&gt;"on_hold"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mark_closed&lt;/span&gt;
      &lt;span class="n"&gt;status_manager&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="vi"&gt;@ticket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;status: &lt;/span&gt;&lt;span class="s2"&gt;"closed"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;status_manager&lt;/span&gt;
      &lt;span class="n"&gt;is_status_changed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt;

      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_status_changed&lt;/span&gt;
        &lt;span class="c1"&gt;# request response logic&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="c1"&gt;# error handler&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="o"&gt;......&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Okay, so where can I use Blocks?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The status_manager from our Ticketing app use case is one of many use cases where blocks can be helpful.&lt;/p&gt;

&lt;p&gt;For instance, consider a few array methods &lt;a href="https://apidock.com/ruby/Array/each"&gt;Array#each&lt;/a&gt;, &lt;a href="https://apidock.com/ruby/Array/map"&gt;Array#map&lt;/a&gt;, &lt;a href="https://apidock.com/ruby/Array/select"&gt;Array#select&lt;/a&gt;, etc., — all these methods accept a block.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"procs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"lambdas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"blocks"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Ruby - &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can do the same with a for loop or a while loop, literally any iterator. But, that’s a lot of code — In other terms, it is imperative programming. You can learn more about imperative, declarative and other programming paradigms &lt;a href="https://en.wikipedia.org/wiki/Comparison_of_programming_paradigms"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I suppose, by now we have our answer to “&lt;em&gt;Why Blocks?&lt;/em&gt;”.&lt;/p&gt;

&lt;p&gt;There is one limitation with blocks though. We can’t assign a &lt;code&gt;block&lt;/code&gt; to a variable. Let’s say we want to implement similar functionality in more than one method. We have to send the block to each of the methods individually — this leads us to the next section “&lt;em&gt;Why Lambdas?&lt;/em&gt;”.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why Lambdas?&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Recap:&lt;/strong&gt; &lt;em&gt;A Lambda is very similar to a block and is also called an anonymous function. But, unlike blocks *lambdas are objects&lt;/em&gt; and can be assigned to variables with a special syntax.*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Using Lambdas and Procs, we can store a block in a variable and reuse. To be more specific, blocks are useless without a method call. Also, lambdas can be called repeatedly without having to rewrite them every time, unlike blocks.&lt;/p&gt;

&lt;p&gt;Lambdas give more flexibility than methods.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;greeter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;greeter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Dear"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Ruby Developer"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;# returns "Dear Ruby Developer"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In simpler terms, lambda is like any other method that takes a block with an exception being assignable to variables.&lt;/p&gt;

&lt;p&gt;Let’s consider the Ticketing System again, this time will update our blocks to a single lambda.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TicketsController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
    &lt;span class="o"&gt;......&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mark_open&lt;/span&gt;
      &lt;span class="n"&gt;status_manager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"open"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mark_on_hold&lt;/span&gt;
      &lt;span class="n"&gt;status_manager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"on_hold"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mark_closed&lt;/span&gt;
      &lt;span class="n"&gt;status_manager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"closed"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;status_updater&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;status: &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;status_manager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;is_status_changed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;status_updater&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@ticket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="o"&gt;.....&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="o"&gt;......&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s take another use case and see how lambdas can be helpful.&lt;/p&gt;

&lt;p&gt;This time we assume a gem for API service and we have a method called callback that is triggered for either success or failure responses. We need this method to be customizable and allow the gem user to define its functionality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="c1"&gt;# gem code&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SomeAPIServiceController&lt;/span&gt;
    &lt;span class="o"&gt;.....&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;on_success: &lt;/span&gt;&lt;span class="n"&gt;on_failure&lt;/span&gt;&lt;span class="p"&gt;:)&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt;
        &lt;span class="n"&gt;on_success&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;on_failure&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="o"&gt;.....&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use blocks, but we are limited to use only one block per method call. So, how can we pass multiple blocks to this callback method?&lt;/p&gt;

&lt;p&gt;Wait for it, Wait for it, lambdas lambdas yessss, lambdas to the rescue.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;success_callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# Do something with response }&lt;/span&gt;
  &lt;span class="n"&gt;failure_callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# Do something with error }&lt;/span&gt;

  &lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="ss"&gt;on_success: &lt;/span&gt;&lt;span class="n"&gt;success_callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;on_failure: &lt;/span&gt;&lt;span class="n"&gt;failure_callback&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With that we are left with the final question in our Blocks, Lambdas and Procs Exploration — &lt;em&gt;Why Procs?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With no further delay, let’s unravel the procs.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why Procs?&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Recap&lt;/strong&gt;: &lt;em&gt;Procs, the shorthand for Procedure, is a very similar concept to lambdas. Procs are instances of ruby &lt;code&gt;Proc&lt;/code&gt; class.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lambdas are a special case of Procs and are a &lt;code&gt;proc&lt;/code&gt; object. There is no dedicated &lt;code&gt;Lambda&lt;/code&gt; class. If you have understood the &lt;strong&gt;why Lambdas?&lt;/strong&gt; section, we already have our answer to &lt;em&gt;why Procs?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Also, we can use Procs instead of lambdas in every possible use-case, but lambdas and procs have their differences which I explained in &lt;a href="https://dev.to/krrish96/understanding-procs-lambdas-and-blocks-in-ruby-part-1-all-what-s-answered-8ii"&gt;Part1: All’s What?s Answered.&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Procs are full-fledged Objects and have all the abilities that an object does, while blocks on the other hand does not.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since lambdas and procs are objects we can do all the crazy stuff that an object can do.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;proc_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am Proc!"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;#&amp;lt;Proc:0x00007fc1ccfdcb50@(irb):9&amp;gt;&lt;/span&gt;

  &lt;span class="n"&gt;proc_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;
  &lt;span class="c1"&gt;# "I am Proc!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Well, that concludes our journey.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;That’s too much man&lt;/strong&gt; 🤓
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://blog.saikrishna.dev"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LIjGWJ5q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/xrv1om2477aozawkhwnq.png" alt="Tired Puppy Image" width="500" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s do a quick summary and play with our cute little 🐶 buddy….&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A method can neither be passed as argument nor be returned from another method (methods in ruby are not first-class functions).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blocks are useless without method calls and have to be rewritten every time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blocks give back control to the programmer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Procs are full-fledged Objects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lambdas are a special case of procs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lambdas are more flexible than methods.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using blocks, lambdas, and procs. One method can be made to work in different aspects by injecting some custom code within the method from outside.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;References&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/10141124/any-difference-between-first-class-function-and-high-order-function"&gt;Any difference between First Class Function and High Order Function&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://mixandgo.com/learn/mastering-ruby-blocks-in-less-than-5-minutes"&gt;Mastering Ruby Blocks in Less Than 5 Minutes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.rubyguides.com/2016/02/ruby-procs-and-lambdas/"&gt;The Ultimate Guide to Blocks, Procs &amp;amp; Lambdas&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And a lot of bits and pieces from mother google.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am a beginner to ruby, so please let me know if I have missed or misunderstood something above. I look forward to your suggestions and feedback in the comments section below.&lt;/p&gt;

&lt;p&gt;I hope this article helped you understand procs, lambdas and blocks better.&lt;/p&gt;

&lt;p&gt;Thank you for reading this post, This is &lt;a href="https://www.linkedin.com/in/kskp1996"&gt;Sai Krishna Prasad&lt;/a&gt;, a self-taught and passionate web developer. Signing off Bubye….. until next time.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>beginners</category>
      <category>rails</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Understanding Procs, Lambdas, and Blocks in Ruby - Part 1: All What?s Answered</title>
      <dc:creator>Sai Krishna</dc:creator>
      <pubDate>Sun, 23 Feb 2020 13:27:26 +0000</pubDate>
      <link>https://forem.com/krrish96/understanding-procs-lambdas-and-blocks-in-ruby-part-1-all-what-s-answered-8ii</link>
      <guid>https://forem.com/krrish96/understanding-procs-lambdas-and-blocks-in-ruby-part-1-all-what-s-answered-8ii</guid>
      <description>&lt;p&gt;I recently started learning ruby as part of my journey to be a full stack developer. I am using &lt;a href="https://rubymonk.com"&gt;rubymonk.com&lt;/a&gt; which is a really good source for an absolute beginner. After a few smooth moving lessons and problems, I landed on the Procs and Lambdas section. I had a hard time understanding procs, lambdas, and blocks.&lt;/p&gt;

&lt;p&gt;After spending a good amount of time with them, I finally have some clarity on how procs and lambdas work. Now I want to share my knowledge so that others will have an easier time understanding them.&lt;/p&gt;

&lt;p&gt;I would like to explain procs and lambdas with two W questions, What? and Why? Let’s start with a few what?’s.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;What are the Blocks?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before jumping into procs and lambdas, let’s get a clear picture of what blocks are.&lt;/p&gt;

&lt;p&gt;A block is a piece of a code that is either enclosed within curly braces &lt;code&gt;{}&lt;/code&gt; or a &lt;code&gt;do..end&lt;/code&gt;. It is similar to a method but neither belongs to any object nor it has a name. Syntactically &lt;code&gt;{}&lt;/code&gt; is used for &lt;strong&gt;one-liner&lt;/strong&gt; blocks and &lt;code&gt;do..end&lt;/code&gt; for &lt;strong&gt;multi-line&lt;/strong&gt; blocks. Let’s take a look at the following snippet to see the difference.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;concepts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'blocks'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'lambdas'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'procs'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="c1"&gt;# One liner {} blocks&lt;/span&gt;
  &lt;span class="n"&gt;concepts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Ruby: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;# Multi-line do..end blocks&lt;/span&gt;
  &lt;span class="n"&gt;mastered_concepts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'blocks'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'procs'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="n"&gt;concepts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;mastered_concepts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I already mastered &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Yet to learn this &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;The Implicit Block with its friendly keyword yield&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Blocks are also called closures in other languages. Blocks can be passed to a method either implicitly or explicitly. Only one block can be passed to a method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Implicit blocks&lt;/em&gt;&lt;/strong&gt; are nameless and not necessarily we list them in the method arguments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;implicit_block_method&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;implicit_block_method&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am an implicit block, also I am nameless!"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Implicit Blocks can be invoked using the keyword &lt;code&gt;yield&lt;/code&gt;. They can accept arguments too, if necessary. In other terms, blocks are just an anonymous chunk of code that is passed to a method to perform something.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_skills&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="s2"&gt;"procs"&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="s2"&gt;"blocks"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;my_skills&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am skilled in Ruby &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One thing to note here is that yield is just a keyword that invokes the block as many times it is used inside a method.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Explicit Block and its name everything syndrome&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Explicit blocks&lt;/em&gt;&lt;/strong&gt; are named and should be included in the arguments list.&lt;/p&gt;

&lt;p&gt;The block should be the last argument that a method accepts. Explicit Blocks can be invoked by using the .call method on the block name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;explicit_block_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argument_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;block_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;explicit_block_method&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am an explicit block, My name is block_name"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An Example with multiple arguments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;block_caller_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;normal_argument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block_as_argument&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;normal_argument&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; inside method"&lt;/span&gt;
    &lt;span class="n"&gt;block_as_argument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt; &lt;span class="s2"&gt;"argument for block"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;block_caller_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Normal argument"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;argument_for_block&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Inside block and received &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;argument_for_block&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Does a block return?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Yes&lt;/strong&gt;, Blocks can return, just like methods. let’s talk about this in code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'ruby'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'javascript'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'python'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'java'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# returns ['ruby', 'java']&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we are performing &lt;a href="https://apidock.com/ruby/Array/select"&gt;Array#select&lt;/a&gt; and passing in a block to specify our condition. This will return a new array with languages that have 4 character long names.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Safeguard your method with “block_given?”&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Huff!! That’s a lot. There is one last thing we should know about blocks.&lt;/p&gt;

&lt;p&gt;What if no block is passed to a method but we are expecting one, Ruby throws an error &lt;code&gt;LocalJumpError&lt;/code&gt; if yield is used and &lt;code&gt;NoMethodError&lt;/code&gt; if the method call is called on the block.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;expecting_block&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;expecting_block&lt;/span&gt;
  &lt;span class="c1"&gt;# LocalJumpError (no block given (yield))&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;me_to_expecting_block&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;block_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;me_to_expecting_block&lt;/span&gt;
  &lt;span class="c1"&gt;# NoMethodError (undefined method `call' for nil:NilClass)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To fix this we just need to check if the block is given or not, using &lt;code&gt;block_given?&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_block_given&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;block_given?&lt;/span&gt;
      &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="s2"&gt;"Yes"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am hurt :-/, I thought you would give me a block!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;is_block_given&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; it is."&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;# Yes it is.&lt;/span&gt;

  &lt;span class="n"&gt;is_block_given&lt;/span&gt;
  &lt;span class="c1"&gt;# I am hurt :-/, I thought you would give me a block!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;What are Lambdas?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now that we have some knowledge on blocks let’s move on to lambdas. Understanding blocks makes understanding lambdas much easier.&lt;/p&gt;

&lt;p&gt;Lambda is the eleventh letter in the Greek alphabets…. Whaaaat? Oh, Shoot!! We are not talking about this(&lt;code&gt;λ&lt;/code&gt;) lambda. Let’s get to know the lambdas in ruby then.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A Lambda is very similar to a block and is also called an anonymous function. But, unlike blocks &lt;strong&gt;&lt;em&gt;lambdas are objects&lt;/em&gt;&lt;/strong&gt; and can be assigned to variables with a special syntax.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We can create lambda by using the keyword &lt;code&gt;lambda&lt;/code&gt; or the &lt;code&gt;-&amp;gt;&lt;/code&gt; stab operator. The lambdas created with &lt;code&gt;-&amp;gt;&lt;/code&gt; stab operator are also called a stabby lambda.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="c1"&gt;# lambda block&lt;/span&gt;
  &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am a block declared with lambda"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;# -&amp;gt; block&lt;/span&gt;
  &lt;span class="n"&gt;stabby_lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Alternate syntax, stabby lambda"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;The Proc class&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When we created a lambda you might have observed something weird.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"A new lambda has been created."&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;# &amp;lt;Proc:0x00007ff3758d7b68@(irb):54 (lambda)&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lambda is created as a new instance of the class &lt;code&gt;Proc&lt;/code&gt;. Yes, This is fine. Because lambda’s do not have a dedicated class they are part of the class &lt;code&gt;Proc&lt;/code&gt;. You can check this by calling the method &lt;code&gt;class&lt;/code&gt; on the lambda.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Proc is my class!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;
  &lt;span class="c1"&gt;# returns Proc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Proc is the short form for Procedure, We will talk more about procs in the next section. You can happily ignore it for now.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Arguments in lambda&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Lambdas also accept arguments, But the syntax for this is dependent on whether you’ve declared the lambda with the &lt;code&gt;lambda&lt;/code&gt; keyword or with the &lt;code&gt;-&amp;gt;&lt;/code&gt; operator.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am lambda &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;."&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;stabby_lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am also lambda &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;."&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt; &lt;span class="s2"&gt;"Argument"&lt;/span&gt;
  &lt;span class="c1"&gt;# I am lambda Argument.&lt;/span&gt;

  &lt;span class="n"&gt;stabby_lambda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt; &lt;span class="s2"&gt;"Argument"&lt;/span&gt;
  &lt;span class="c1"&gt;# I am also lambda Argument.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lambdas can also be called in multiple ways.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Hello &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt; &lt;span class="s2"&gt;"Ruby"&lt;/span&gt;
  &lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Ruby"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Ruby"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;=&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Ruby"&lt;/span&gt;

  &lt;span class="c1"&gt;# all of them prints the same, "Hello Ruby!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Lambda in action&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Lambdas can be stored in a variable and can be passed to any method as an argument.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;double_it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;double_it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;# returns [2,4,6,8,10]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Did you notice the &lt;code&gt;&amp;amp;&lt;/code&gt;(ampersand) symbol appended to double_it?. That’s a short form for calling the methodto_proc on the variable we stored. Also, &lt;code&gt;&amp;amp;&lt;/code&gt; is the one responsible for converting a lambda / proc to block. Usually, &lt;a href="https://apidock.com/ruby/Array/map"&gt;Array#map&lt;/a&gt; expects a block, not a lambda / proc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;code&gt;&amp;amp;double_it&lt;/code&gt; is equivalent to &lt;code&gt;double_it.to_proc.call&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s all we need to know about lambdas for now. Let’s move on to procs.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;What are Procs?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Proc, the shorthand for Procedure, is a very similar concept to lambdas. Lambdas are a subpart of Procs. As we have already seen, the &lt;code&gt;class&lt;/code&gt; for &lt;code&gt;lambda&lt;/code&gt; is a &lt;code&gt;Proc&lt;/code&gt;. Like lambdas, &lt;strong&gt;&lt;em&gt;Procs are objects of ruby Proc class&lt;/em&gt;&lt;/strong&gt;. Though lambdas and procs are similar, they also have their differences. But we will get to that in a bit.&lt;/p&gt;

&lt;p&gt;We can create a proc with a new instance of the Proc class &lt;code&gt;Proc.new&lt;/code&gt; or with the keyword &lt;code&gt;proc&lt;/code&gt; which is again the same as &lt;code&gt;Proc.new&lt;/code&gt; and is just syntactical sugar. Let's create some procs…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="c1"&gt;# Proc.new block&lt;/span&gt;
  &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am proc, New instance of Proc class."&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;# proc block&lt;/span&gt;
  &lt;span class="n"&gt;new_proc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nb"&gt;proc&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am a proc with keyword!"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Calling procs and passing them arguments is very similar to lambdas, so I am not going to spend a whole lot of time on it. We should say lambdas are similar to procs. Just call the method class on lambda and proc and it answers everything. Both returns Proc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;
  &lt;span class="nb"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;

  &lt;span class="c1"&gt;# both returns Proc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also to show that lambdas and procs are objects, call &lt;code&gt;superclass&lt;/code&gt; method on the class Proc . It returns Object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="no"&gt;Proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;superclass&lt;/span&gt;

  &lt;span class="c1"&gt;# returns Object&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Procs vs Lambdas&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;There are a couple of important differences between &lt;strong&gt;procs&lt;/strong&gt; and &lt;strong&gt;lambdas&lt;/strong&gt; specifically Arguments Handling and Return statement behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Arguments Handling&lt;/em&gt;&lt;/strong&gt;, We have a very strict officer here. Guess Who? Yeah, you guessed it right. It’s officer Lambda.&lt;/p&gt;

&lt;p&gt;Lambdas throw an exception (&lt;code&gt;ArgumentError&lt;/code&gt;) when an incorrect number of arguments are passed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am strict, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; and &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;arg2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Tough"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;# ArgumentError (wrong number of arguments (given 1, expected 2))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While Procs aren’t worried about them at all. If an extra argument is passed procs will ignore it. If fewer than expected arguments are passed procs will replace all the missed ones with nil.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I am too lazy to care about &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nb"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;

  &lt;span class="c1"&gt;# I am too lazy to care about&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Though procs don’t throw an exception for the number of arguments, other cases could raise exceptions. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;addition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;num1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num2&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;num1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;num2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;# passing only 1 argument&lt;/span&gt;
  &lt;span class="n"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;# TypeError (nil can't be coerced into Integer)&lt;/span&gt;

  &lt;span class="c1"&gt;# passing no arguments&lt;/span&gt;
  &lt;span class="n"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;
  &lt;span class="c1"&gt;# NoMethodError (undefined method `+' for nil:NilClass)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;proc&lt;/code&gt; is not worried about arguments and replaces the missed one with nil. Programmatically nil can’t be added to Integer. So, we get a &lt;code&gt;TypeError&lt;/code&gt; or &lt;code&gt;NoMethodError&lt;/code&gt; as above.&lt;/p&gt;

&lt;p&gt;Just to be on the safer side, always set default values to arguments. If default values cannot be set make sure to pass the required number of arguments or have error handling blocks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;addition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;num1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;num1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;num2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;
  &lt;span class="c1"&gt;# returns 0&lt;/span&gt;

  &lt;span class="n"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;# returns 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Return statement Behavior&lt;/em&gt;&lt;/strong&gt;, lambdas, and procs behave in a very different manner when comes to return statements.&lt;/p&gt;

&lt;p&gt;Lambdas will return from the executing block/lambda and the further execution will continue as usual.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;return_from_lambda&lt;/span&gt;
    &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="s2"&gt;"I will just return from lambda!"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I will execute, before lambda return!"&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I too will execute, after lambda return!"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;return_from_lambda&lt;/span&gt;

  &lt;span class="c1"&gt;# I will execute, before lambda return!&lt;/span&gt;
  &lt;span class="c1"&gt;# I will just return from lambda!&lt;/span&gt;
  &lt;span class="c1"&gt;# I too will execute, after lambda return!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While procs will return from the currently executing context/method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;proc_return_method&lt;/span&gt;
    &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="s2"&gt;"I will return the method!"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I will execute, before proc return."&lt;/span&gt;
    &lt;span class="nb"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"I will never execute, after proc return!"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;proc_return_method&lt;/span&gt;

  &lt;span class="c1"&gt;# prints "I will execute, before proc return!"&lt;/span&gt;
  &lt;span class="c1"&gt;# returns "I will return the method!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is one thing that we must know while handling returns with &lt;code&gt;proc&lt;/code&gt;. As I mentioned proc will return from the method. If we just create a proc and call it without any context ruby raises a &lt;code&gt;LocalJumpError&lt;/code&gt; as there is nothing to Jump back after returning from the current context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;error_proc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"I will raise exception"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;error_proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;

  &lt;span class="c1"&gt;# LocalJumpError (unexpected return)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aaannnddddd!!! We are done.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;In Nutshell&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Blocks&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Block is a piece of code enclosed between &lt;code&gt;{}&lt;/code&gt; or &lt;code&gt;do..end&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Block neither belongs to any object nor it has a name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blocks can return just like methods.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lambdas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Lambdas are objects, unlike blocks. Also, lambdas have a name and can be assigned to a variable for later use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lambda can be created either with the &lt;code&gt;lambda&lt;/code&gt; keyword or with the &lt;code&gt;-&amp;gt;&lt;/code&gt; stab operator.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lambdas are strict in terms of arguments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lambdas are a part of the &lt;code&gt;Proc&lt;/code&gt; class.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lambda returns from current lambda/block.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Procs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Procs are also objects and have a name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proc can be created by &lt;code&gt;Proc.new&lt;/code&gt; or with keyword &lt;code&gt;proc&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Procs aren’t worried about the number of arguments passed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proc returns from a method/current context.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blocks, Lambdas, and Procs are all Closures.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well well, well!!! We made it! Now we have answers to most whats on Procs, Lambdas, and Blocks.&lt;/p&gt;

&lt;p&gt;In the next part of this article, I will talk about next W “why?” with a few examples demonstrating why we need procs and lambdas in the first place.&lt;/p&gt;

&lt;p&gt;I am a beginner to ruby, so please let me know if I have missed or misunderstood something above. I look forward to your suggestions and feedback in the comments section below.&lt;/p&gt;

&lt;p&gt;I hope this article helped you understand procs, lambdas and blocks better.&lt;/p&gt;

&lt;p&gt;Thank you for reading this post, This is &lt;a href="https://www.linkedin.com/in/kskp1996"&gt;Sai Krishna Prasad&lt;/a&gt;, a self-taught and passionate web developer. Signing off Bubye….. until next time.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>beginners</category>
      <category>rails</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
