https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112015-07-19T13:37:40ZRuby Issue Tracking SystemRuby master - Feature #11361: proposal for easy method to nil-guard for generated variable name.https://bugs.ruby-lang.org/issues/11361?journal_id=534652015-07-19T13:37:40Zmarcandre (Marc-Andre Lafortune)marcandre-ruby-core@marc-andre.ca
<ul></ul><p>Isn't this simpler (and easier to read):</p>
<pre><code>@cache ||= {}
@cache[id] ||= User.find(1)
</code></pre>
<p>I can't recall ever needing to do what you want to do.</p> Ruby master - Feature #11361: proposal for easy method to nil-guard for generated variable name.https://bugs.ruby-lang.org/issues/11361?journal_id=570682016-02-21T12:01:01Zjwmittag (Jörg W Mittag)Ruby-Lang@JoergWMittag.De
<ul></ul><p>masaki yamada wrote:</p>
<blockquote>
<p>It's easy to 'nil-guard' for normal variable.</p>
</blockquote>
<blockquote>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">def</span> <span class="nf">user</span>
<span class="vi">@user</span> <span class="o">||=</span> <span class="no">User</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">end</span>
</code></pre>
<p>but it's not simple for generated variable name.</p>
</blockquote>
<blockquote>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">def</span> <span class="nf">user</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span>
<span class="n">variable_name</span> <span class="o">=</span> <span class="s2">"@user_</span><span class="si">#{</span><span class="nb">id</span><span class="si">}</span><span class="s2">"</span>
<span class="nb">instance_variable_set</span><span class="p">(</span><span class="n">variable_name</span><span class="p">,</span> <span class="no">User</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="nb">id</span><span class="p">))</span> <span class="k">unless</span> <span class="n">instance_variable_defined?</span><span class="p">(</span><span class="n">variable_name</span><span class="p">)</span>
<span class="nb">instance_variable_get</span><span class="p">(</span><span class="n">variable_name</span><span class="p">)</span>
<span class="k">end</span>
</code></pre>
</blockquote>
<p>Note that the two examples you gave are <em>not</em> equivalent: the first assigns to the variable if it evaluates to <code>false</code> or <code>nil</code> regardless of whether it is defined or not, the second only assigns if it is undefined. Which one of the two do you want?</p>