https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112017-10-18T14:48:40ZRuby Issue Tracking SystemRuby master - Feature #14025: #initialize with ivarshttps://bugs.ruby-lang.org/issues/14025?journal_id=672972017-10-18T14:48:40Zfrankpimenta (Frank Pimenta)
<ul><li><strong>Tracker</strong> changed from <i>Bug</i> to <i>Feature</i></li><li><strong>Backport</strong> deleted (<del><i>2.3: UNKNOWN, 2.4: UNKNOWN</i></del>)</li></ul> Ruby master - Feature #14025: #initialize with ivarshttps://bugs.ruby-lang.org/issues/14025?journal_id=673082017-10-18T19:44:52Zfrankpimenta (Frank Pimenta)
<ul></ul><pre><code class="ruby syntaxhl" data-language="ruby"> <span class="k">module</span> <span class="nn">ObjectInitialization</span>
<span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">included</span> <span class="n">base</span>
<span class="n">base</span><span class="p">.</span><span class="nf">class_eval</span> <span class="k">do</span>
<span class="kp">extend</span> <span class="no">ClassMethods</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">module</span> <span class="nn">ClassMethods</span>
<span class="k">def</span> <span class="nf">attr_initializer</span> <span class="n">default_arguments</span><span class="o">=</span><span class="p">{}</span>
<span class="k">raise</span> <span class="no">RuntimeError</span><span class="p">.</span><span class="nf">new</span> <span class="s2">"No args provided to ::init"</span> <span class="k">if</span> <span class="n">default_arguments</span><span class="p">.</span><span class="nf">empty?</span>
<span class="vc">@@__default_arguments__</span> <span class="o">=</span> <span class="n">default_arguments</span>
<span class="nb">class_eval</span> <span class="k">do</span>
<span class="n">define_method</span> <span class="ss">:initialize</span> <span class="k">do</span> <span class="o">|</span><span class="n">args</span><span class="o">=</span><span class="kp">nil</span><span class="o">|</span>
<span class="n">arguments</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="nf">nil?</span> <span class="p">?</span> <span class="vc">@@__default_arguments__</span> <span class="p">:</span> <span class="vc">@@__default_arguments__</span><span class="p">.</span><span class="nf">merge</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="n">arguments</span><span class="p">.</span><span class="nf">each_pair</span> <span class="k">do</span> <span class="o">|</span><span class="nb">name</span><span class="p">,</span> <span class="n">value</span><span class="o">|</span>
<span class="nb">instance_variable_set</span> <span class="s2">"@</span><span class="si">#{</span><span class="nb">name</span><span class="p">.</span><span class="nf">to_s</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="n">value</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">class</span> <span class="nc">Object</span>
<span class="kp">include</span> <span class="no">ObjectInitialization</span>
<span class="k">end</span>
<span class="k">class</span> <span class="nc">Person</span>
<span class="n">attr_initializer</span> <span class="ss">name: </span><span class="s1">'person'</span><span class="p">,</span> <span class="ss">age: </span><span class="mi">18</span><span class="p">,</span> <span class="ss">address: </span><span class="s2">"somewhere"</span>
<span class="k">end</span>
<span class="n">p0</span> <span class="o">=</span> <span class="no">Person</span><span class="p">.</span><span class="nf">new</span>
<span class="n">p1</span> <span class="o">=</span> <span class="no">Person</span><span class="p">.</span><span class="nf">new</span> <span class="ss">name: </span><span class="s2">"frank"</span>
<span class="n">p2</span> <span class="o">=</span> <span class="no">Person</span><span class="p">.</span><span class="nf">new</span> <span class="ss">name: </span><span class="s2">"adam"</span><span class="p">,</span> <span class="ss">profession: </span><span class="s2">"developer"</span>
</code></pre> Ruby master - Feature #14025: #initialize with ivarshttps://bugs.ruby-lang.org/issues/14025?journal_id=673272017-10-19T05:28:11Zshevegen (Robert A. Heiler)shevegen@gmail.com
<ul></ul><p>I don't quite understand your second example.</p>
<pre><code>class Person
initialize name: 'person', age: 18
</code></pre>
<p>Did you not define before that only one argument can be passed?</p>
<pre><code>class Person
def initialize name = 'person'
</code></pre>
<p>By the way, I seem to be missing parts of what you are trying to<br>
suggest.</p>
<p>If you mean to initialize @variables by default, similar to what<br>
crystal does, then I think this has been suggested before. I do<br>
not know of the current status either way, but I think that it<br>
may be for ruby 3.x at best due to backwards compatibility (I may<br>
be wrong here too but the ruby core team has said this a few<br>
times before in general).</p> Ruby master - Feature #14025: #initialize with ivarshttps://bugs.ruby-lang.org/issues/14025?journal_id=673382017-10-19T06:50:48Zfrankpimenta (Frank Pimenta)
<ul></ul><p>Where did I define that only one argument could be passed?</p>
<p>I don't want to initialize ivar explicitly in #initialize.</p>
<p>I would like that instead of:</p>
<p>def initialize name='default_name', age=0<br>
@name, @age = name, age<br>
end</p>
<p>I could do either:</p>
<p>def initialize @name = 'default_name', @age=0<br>
end</p>
<p>or as with getter and setters via attr_* :</p>
<p>initialize name: 'default_name', age: 0</p>
<p>What parts do you think are missing? Maybe I already know them but I am trying to find time to fulfil it.</p>