Un détail sur leur fonctionnement
Les variables locales sont en Ruby créées lorsque le parseur les rencontres et non dynamiquement à l’exécution ! De plus, un if ne créé pas de nouveau scope rendant les variables accessibles après la fin de celui-ci. C’est aussi le cas pour unless, while, until et for.

Un exemple plus intéressant mettant mieux en évidence l’étape du parseur. Dans le 1e if, le parseur voit et créé la variable a après la condition qui sera donc fausse au moment de l’exécution. Dans le 2e cas, il voit et créé b avant ! (Un if inline n’est donc pas équivalent !)

Le lien vers la documentation Ruby des variables locales.