https://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112015-12-30T07:44:12ZRuby Issue Tracking SystemRuby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=558652015-12-30T07:44:12Zksss (Yuki Kurihara)co000ri@gmail.com
<ul></ul><p>Hi.</p>
<p>I have thought the same thing that want to use kwargs in Struct class.</p>
<p>But I can't come up with a good API.</p>
<p>Finally, I made a gem. <a href="https://github.com/ksss/type_struct" class="external">https://github.com/ksss/type_struct</a></p> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=586672016-05-17T06:37:46Znaruse (Yui NARUSE)naruse@airemix.jp
<ul><li><strong>Assignee</strong> deleted (<del><i>core</i></del>)</li></ul> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=587182016-05-18T00:23:37Zshyouhei (Shyouhei Urabe)shyouhei@ruby-lang.org
<ul></ul><p>We looked at this issue in yesterday's developer meeting. Nobody there was against the functionality -- but the name. <code>create!</code> doesn't sound appropriate at all. <code>create</code> also not that obvious for non-English speakers like us that it expects keywords.</p> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=610642016-10-25T06:58:43Zherwinw (Herwin Quarantainenet)herwin@quarantainenet.nl
<ul></ul><p>What about <code>new_from_kwargs(**kwargs)</code> ? It's a bit long, but it describes the functionality exactly.</p> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=610662016-10-25T18:37:46Zherwin (Herwin W)
<ul></ul><p><a href="https://github.com/ruby/ruby/pull/1468" class="external">https://github.com/ruby/ruby/pull/1468</a></p>
<p>A proposal for an implementation.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">001</span><span class="p">:</span><span class="mi">0</span><span class="o">></span> <span class="no">MyClass</span> <span class="o">=</span> <span class="no">Struct</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="ss">:a</span><span class="p">,</span> <span class="ss">:b</span><span class="p">,</span> <span class="ss">:c</span><span class="p">)</span>
<span class="o">=></span> <span class="no">MyClass</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">002</span><span class="p">:</span><span class="mi">0</span><span class="o">></span> <span class="no">MyClass</span><span class="p">.</span><span class="nf">new_from_kwargs</span><span class="p">(</span><span class="n">a</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span> <span class="ss">c: </span><span class="mi">3</span><span class="p">)</span>
<span class="o">=></span> <span class="c1">#<struct MyClass a=1, b=nil, c=3></span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">003</span><span class="p">:</span><span class="mi">0</span><span class="o">></span> <span class="no">MyClass</span><span class="p">.</span><span class="nf">new_from_kwargs</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="ss">b: </span><span class="mi">3</span><span class="p">)</span>
<span class="o">=></span> <span class="c1">#<struct MyClass a=1, b=3, c=3></span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">004</span><span class="p">:</span><span class="mi">0</span><span class="o">></span> <span class="no">MyClass</span><span class="p">.</span><span class="nf">new_from_kwargs</span><span class="p">(</span><span class="ss">d: </span><span class="mi">4</span><span class="p">)</span>
<span class="no">NameError</span><span class="p">:</span> <span class="n">no</span> <span class="n">member</span> <span class="s1">'d'</span> <span class="k">in</span> <span class="n">struct</span>
<span class="n">from</span> <span class="p">(</span><span class="n">irb</span><span class="p">):</span><span class="mi">4</span><span class="ss">:in</span> <span class="sb">`new_from_kwargs'
from (irb):4
from ./irb:11:in `</span><span class="o"><</span><span class="n">main</span><span class="o">></span><span class="s1">'
irb(main):005:0> MyClass.new_from_kwargs(1, 2, 4, 5, b: 3)
IndexError: offset 3 too large for struct(size:3)
from (irb):5:in `new_from_kwargs'</span>
<span class="n">from</span> <span class="p">(</span><span class="n">irb</span><span class="p">):</span><span class="mi">5</span>
<span class="n">from</span> <span class="p">.</span><span class="nf">/</span><span class="n">irb</span><span class="p">:</span><span class="mi">11</span><span class="ss">:in</span> <span class="sb">`<main>'
irb(main):006:0>
</span></code></pre> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=610682016-10-25T18:54:51Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul></ul><p>Herwin W wrote:</p>
<blockquote>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">003</span><span class="p">:</span><span class="mi">0</span><span class="o">></span> <span class="no">MyClass</span><span class="p">.</span><span class="nf">new_from_kwargs</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="ss">b: </span><span class="mi">3</span><span class="p">)</span>
<span class="o">=></span> <span class="c1">#<struct MyClass a=1, b=3, c=3></span>
</code></pre>
</blockquote>
<p>Why does <code>new_from_kwargs</code> accept other than keyword arguments?</p> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=610692016-10-25T19:05:53Zherwin (Herwin W)
<ul></ul><p>To be prepared for "the great unification of constructors" of course.</p>
<p>It looked like a pretty logical step to support while I was coding this. It's also pretty easy to remove again</p> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=621622016-12-21T06:52:04Zshyouhei (Shyouhei Urabe)shyouhei@ruby-lang.org
<ul><li><strong>Has duplicate</strong> <i><a class="issue tracker-2 status-5 priority-4 priority-default closed" href="/issues/9209">Feature #9209</a>: Struct instances creatable with named args</i> added</li></ul> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=626052017-01-20T04:41:23Zko1 (Koichi Sasada)
<ul></ul><p>Another idea is introducing another method to define own struct, such as <code>T = Struct.define(:a, :b); T.new(a: 1, b: 2)</code> and so on.<br>
(just idea) Moreover we can extend Struct with some properties, like: <code>Struct.define(:a, b: :read_only)</code>.</p>
<p>These ideas are provided by another person.</p> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=633172017-03-03T04:58:11Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul><li><strong>Has duplicate</strong> <i><a class="issue tracker-2 status-5 priority-4 priority-default closed" href="/issues/13272">Feature #13272</a>: Keyword argument to instantiate a subclass of Struct</i> added</li></ul> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=682082017-12-06T13:57:39Zk0kubun (Takashi Kokubun)takashikkbn@gmail.com
<ul></ul><p>Similar to one commented by ko1, how about this interface?</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">T</span> <span class="o">=</span> <span class="no">Struct</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="ss">:a</span><span class="p">,</span> <span class="ss">:b</span><span class="p">,</span> <span class="ss">keyword_argument: </span><span class="kp">true</span><span class="p">)</span>
<span class="no">T</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="ss">a: </span><span class="mi">1</span><span class="p">,</span> <span class="ss">b: </span><span class="mi">2</span><span class="p">)</span>
</code></pre>
<p>As <code>keyword_argument</code> is long, another option is:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">Struct</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="ss">:a</span><span class="p">,</span> <span class="ss">:b</span><span class="p">,</span> <span class="ss">keyword_args: </span><span class="kp">true</span><span class="p">)</span>
</code></pre> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=682492017-12-10T06:47:47Zk0kubun (Takashi Kokubun)takashikkbn@gmail.com
<ul></ul><p>In case that my suggestion of the name is accepted, I wrote a patch for Struct.new(:a, :b, keyword_args: true).<br>
<a href="https://github.com/ruby/ruby/pull/1771" class="external">https://github.com/ruby/ruby/pull/1771</a></p> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=682932017-12-12T07:42:44Zknu (Akinori MUSHA)knu@ruby-lang.org
<ul></ul><p>What if <code>Struct.new([:a, :b])</code> created a class with the desired constructor?</p> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=682952017-12-12T07:54:26Zmatz (Yukihiro Matsumoto)matz@ruby.or.jp
<ul></ul><p>I vote for the keyword argument (e.g. <code>keyword_init:</code>) to <code>Struct#new</code>.</p>
<p>Matz.</p> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=682962017-12-12T08:06:17Zherwin (Herwin W)
<ul></ul><p>knu (Akinori MUSHA) wrote:</p>
<blockquote>
<p>What if <code>Struct.new([:a, :b])</code> created a class with the desired constructor?</p>
</blockquote>
<p>If you'd compare the two possible constructors:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">Struct</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="ss">:a</span><span class="p">,</span> <span class="ss">:b</span><span class="p">)</span>
<span class="no">Struct</span><span class="p">.</span><span class="nf">new</span><span class="p">([</span><span class="ss">:a</span><span class="p">,</span> <span class="ss">:b</span><span class="p">])</span>
</code></pre>
<p>There is nothing in the second one that would indicate the second creates a keyword constructor. If I hadn't read this discussion, I would just expect them to behave the same.</p> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=683002017-12-12T08:12:54Zk0kubun (Takashi Kokubun)takashikkbn@gmail.com
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li></ul><p>Applied in changeset trunk|r61137.</p>
<hr>
<p>struct.c: add keyword_init option to Struct.new</p>
<p>to initialize struct with keyword arguments.</p>
<p>[Feature <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Feature: Struct construction with kwargs (Closed)" href="https://redmine.ruby-lang.org/issues/11925">#11925</a>] [close GH-1771]</p> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=683012017-12-12T08:16:13Zk0kubun (Takashi Kokubun)takashikkbn@gmail.com
<ul></ul><p>As Matz approved, I committed only keyword_init option which is equivalent to "Point.create(x: 1, y: 2)" in original suggestion. If you still want "Point.create!" version which raises ArgumentError (keyword_init initializes unspecified fields with nil), please file another ticket.</p> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=738932018-09-05T10:21:44Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul><li><strong>Related to</strong> <i><a class="issue tracker-2 status-6 priority-4 priority-default closed" href="/issues/15076">Feature #15076</a>: Struct to raise error when keyword arguments used but not enabled</i> added</li></ul> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=744092018-10-11T13:10:45Zk0kubun (Takashi Kokubun)takashikkbn@gmail.com
<ul><li><strong>Related to</strong> <i><a class="issue tracker-2 status-1 priority-4 priority-default" href="/issues/15222">Feature #15222</a>: Add a way to distinguish between Struct classes with and without keyword initializer</i> added</li></ul> Ruby master - Feature #11925: Struct construction with kwargshttps://redmine.ruby-lang.org/issues/11925?journal_id=852452020-04-22T06:23:21Zk0kubun (Takashi Kokubun)takashikkbn@gmail.com
<ul><li><strong>Related to</strong> <i><a class="issue tracker-2 status-5 priority-4 priority-default closed" href="/issues/16806">Feature #16806</a>: Struct#initialize accepts keyword arguments too by default</i> added</li></ul>