Ruby Issue Tracking System: Issues
https://redmine.ruby-lang.org/
https://redmine.ruby-lang.org/favicon.ico?1711330511
2016-09-01T14:36:42Z
Ruby Issue Tracking System
Redmine
Ruby master - Bug #12717 (Closed): Optional argument treated as kwarg
https://redmine.ruby-lang.org/issues/12717
2016-09-01T14:36:42Z
AMHOL (Andy Holland)
<p>When you define a method with an optional argument and keyword arguments (whether explicitly or with options splat) the defaulted argument can not take a hash argument, instead it is interpreted as keyword arguments:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">Foo</span>
<span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">options</span><span class="p">(</span><span class="n">value</span> <span class="o">=</span> <span class="kp">nil</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
<span class="nb">puts</span> <span class="n">value</span><span class="p">.</span><span class="nf">inspect</span>
<span class="nb">puts</span> <span class="n">options</span><span class="p">.</span><span class="nf">inspect</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">kwarg</span><span class="p">(</span><span class="n">value</span> <span class="o">=</span> <span class="kp">nil</span><span class="p">,</span> <span class="ss">kw: </span><span class="kp">nil</span><span class="p">)</span>
<span class="nb">puts</span> <span class="n">value</span><span class="p">.</span><span class="nf">inspect</span>
<span class="nb">puts</span> <span class="n">kw</span><span class="p">.</span><span class="nf">inspect</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">splat</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="ss">kw: </span><span class="kp">nil</span><span class="p">)</span>
<span class="nb">puts</span> <span class="n">args</span><span class="p">.</span><span class="nf">inspect</span>
<span class="nb">puts</span> <span class="n">kw</span><span class="p">.</span><span class="nf">inspect</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="no">Foo</span><span class="p">.</span><span class="nf">options</span><span class="p">({})</span>
<span class="c1"># nil</span>
<span class="c1"># {}</span>
<span class="no">Foo</span><span class="p">.</span><span class="nf">kwarg</span><span class="p">({})</span>
<span class="c1"># nil</span>
<span class="c1"># nil</span>
<span class="no">Foo</span><span class="p">.</span><span class="nf">splat</span><span class="p">({})</span>
<span class="c1"># []</span>
<span class="c1"># nil</span>
<span class="no">Foo</span><span class="p">.</span><span class="nf">options</span><span class="p">({</span> <span class="ss">key: :value</span> <span class="p">})</span>
<span class="c1"># nil</span>
<span class="c1"># {:key=>:value}</span>
<span class="no">Foo</span><span class="p">.</span><span class="nf">kwarg</span><span class="p">({</span> <span class="ss">key: :value</span> <span class="p">})</span>
<span class="c1"># ArgumentError: unknown keyword: key</span>
<span class="no">Foo</span><span class="p">.</span><span class="nf">splat</span><span class="p">({</span> <span class="ss">key: :value</span> <span class="p">})</span>
<span class="c1"># ArgumentError: unknown keyword: key</span>
</code></pre>
<p>I would expect the output to be:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">Foo</span><span class="p">.</span><span class="nf">options</span><span class="p">({})</span>
<span class="c1"># {}</span>
<span class="c1"># {}</span>
<span class="no">Foo</span><span class="p">.</span><span class="nf">kwarg</span><span class="p">({})</span>
<span class="c1"># {}</span>
<span class="c1"># nil</span>
<span class="no">Foo</span><span class="p">.</span><span class="nf">splat</span><span class="p">({})</span>
<span class="c1"># [{}]</span>
<span class="c1"># nil</span>
<span class="no">Foo</span><span class="p">.</span><span class="nf">options</span><span class="p">({</span> <span class="ss">key: :value</span> <span class="p">})</span>
<span class="c1"># {:key=>:value}</span>
<span class="c1"># {}</span>
<span class="no">Foo</span><span class="p">.</span><span class="nf">kwarg</span><span class="p">({</span> <span class="ss">key: :value</span> <span class="p">})</span>
<span class="c1"># {:key=>:value}</span>
<span class="c1"># nil</span>
<span class="no">Foo</span><span class="p">.</span><span class="nf">splat</span><span class="p">({</span> <span class="ss">key: :value</span> <span class="p">})</span>
<span class="c1"># [{:key=>:value}]</span>
<span class="c1"># nil</span>
</code></pre>