https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112014-10-16T14:55:23ZRuby Issue Tracking SystemRuby master - Feature #10394: An instance method on Enumerator that evaluates the block under with self being the block variable.https://bugs.ruby-lang.org/issues/10394?journal_id=495012014-10-16T14:55:23Zmatz (Yukihiro Matsumoto)matz@ruby.or.jp
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Feedback</i></li></ul><p>I like the idea itself. But I don't think <code>as_self</code> is a good name.<br>
Any other name proposal? Anyone?</p>
<p>Matz.</p> Ruby master - Feature #10394: An instance method on Enumerator that evaluates the block under with self being the block variable.https://bugs.ruby-lang.org/issues/10394?journal_id=495022014-10-16T17:05:36Zgogotanaka (Kazuki Tanaka)mail@tanakakazuki.com
<ul></ul><p>Sounds good for me.<br>
(Actually I face the difficulties to implement <a href="https://bugs.ruby-lang.org/issues/10318" title="#10318" class="external">#10318</a> ... and it's painful)</p>
<p>I just come up with...</p>
<p><code>#as</code><br>
<code>#as_arg(s)</code><br>
<code>#through</code><br>
<code>#member</code><br>
.... ; (</p>
<p>And I'd be happy to call method which needs more than 2 args, if it could be.</p>
<p>just idea.</p> Ruby master - Feature #10394: An instance method on Enumerator that evaluates the block under with self being the block variable.https://bugs.ruby-lang.org/issues/10394?journal_id=495142014-10-18T05:30:17Zsawa (Tsuyoshi Sawada)
<ul></ul><p>If the name is less than five characters, then it would need less typing than the original form, (i.e., five-letter name <code>.xxxxx{foo}</code> would require as much typing as <code>{|x| x.foo}</code>), so there would be more motivation for using this method. It may be good to use some preposition:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">by</span><span class="p">{</span><span class="n">upcase</span><span class="p">}</span>
<span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">by</span><span class="p">{</span><span class="n">concat</span><span class="p">(</span><span class="s2">"ber"</span><span class="p">)}</span>
<span class="p">[</span><span class="s2">" foo "</span><span class="p">,</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">bar</span><span class="se">\n</span><span class="s2">"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">by</span><span class="p">{</span><span class="n">strip</span><span class="p">.</span><span class="nf">upcase</span><span class="p">}</span>
</code></pre>
<p>If one wants to go with a non-letter method name, <code>|</code> may be a candidate:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">].</span><span class="nf">map</span><span class="o">.|</span><span class="p">{</span><span class="n">upcase</span><span class="p">}</span>
<span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">].</span><span class="nf">map</span><span class="o">.|</span><span class="p">{</span><span class="n">concat</span><span class="p">(</span><span class="s2">"ber"</span><span class="p">)}</span>
<span class="p">[</span><span class="s2">" foo "</span><span class="p">,</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">bar</span><span class="se">\n</span><span class="s2">"</span><span class="p">].</span><span class="nf">map</span><span class="o">.|</span><span class="p">{</span><span class="n">strip</span><span class="p">.</span><span class="nf">upcase</span><span class="p">}</span>
</code></pre>
<p>The <code>|</code> character here is reminiscent of the unix pipe, which may be interpreted here as passing the values to the block, and it also resembles the <code>||</code> notation in the block. But I don't know if people might think that ugly. <code>&</code> would keep resemblance to the notation using <code>&</code> with <code>symbol_to_proc</code>, but I don't feel the necessity to do so:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">&</span><span class="p">{</span><span class="n">upcase</span><span class="p">}</span>
<span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">&</span><span class="p">{</span><span class="n">concat</span><span class="p">(</span><span class="s2">"ber"</span><span class="p">)}</span>
<span class="p">[</span><span class="s2">" foo "</span><span class="p">,</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">bar</span><span class="se">\n</span><span class="s2">"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">&</span><span class="p">{</span><span class="n">strip</span><span class="p">.</span><span class="nf">upcase</span><span class="p">}</span>
</code></pre>
<p>Even an asterisk or caret may work.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">*</span><span class="p">{</span><span class="n">upcase</span><span class="p">}</span>
<span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">*</span><span class="p">{</span><span class="n">concat</span><span class="p">(</span><span class="s2">"ber"</span><span class="p">)}</span>
<span class="p">[</span><span class="s2">" foo "</span><span class="p">,</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">bar</span><span class="se">\n</span><span class="s2">"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">*</span><span class="p">{</span><span class="n">strip</span><span class="p">.</span><span class="nf">upcase</span><span class="p">}</span>
</code></pre>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">^</span><span class="p">{</span><span class="n">upcase</span><span class="p">}</span>
<span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">^</span><span class="p">{</span><span class="n">concat</span><span class="p">(</span><span class="s2">"ber"</span><span class="p">)}</span>
<span class="p">[</span><span class="s2">" foo "</span><span class="p">,</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">bar</span><span class="se">\n</span><span class="s2">"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">^</span><span class="p">{</span><span class="n">strip</span><span class="p">.</span><span class="nf">upcase</span><span class="p">}</span>
</code></pre> Ruby master - Feature #10394: An instance method on Enumerator that evaluates the block under with self being the block variable.https://bugs.ruby-lang.org/issues/10394?journal_id=495952014-10-23T00:24:35Zavit (Andrew Vit)andrew@avit.ca
<ul></ul><p>It might be confusing if such a thing only exists for Enumerator blocks and nothing else.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">].</span><span class="nf">map</span><span class="p">.</span><span class="nf">as_self</span> <span class="p">{</span> <span class="n">clear</span> <span class="p">}</span>
<span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">].</span><span class="nf">tap</span><span class="p">.</span><span class="nf">as_self</span> <span class="p">{</span> <span class="n">clear</span> <span class="p">}</span> <span class="c1"># (not an Enumerator)</span>
</code></pre>
<p>What would be the correct receiver in your proposal for the following example? What happens when the method is not defined in the block's "self" object?</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="vi">@members</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">transform_all</span>
<span class="vi">@members</span><span class="p">.</span><span class="nf">each</span><span class="p">.</span><span class="nf">as_self</span> <span class="p">{</span> <span class="n">transform</span> <span class="p">}</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">transform</span>
<span class="k">raise</span> <span class="s2">"this one?"</span>
<span class="k">end</span>
</code></pre>
<p>A little bit related: <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Feature: Object#as (Closed)" href="https://bugs.ruby-lang.org/issues/10095">#10095</a> (for the proposed syntax "as" vs. "as_self")</p> Ruby master - Feature #10394: An instance method on Enumerator that evaluates the block under with self being the block variable.https://bugs.ruby-lang.org/issues/10394?journal_id=778412019-04-30T11:58:12Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul></ul><p>Isn't it <code>instance_eval</code>?</p>