https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2020-11-29T18:32:10Z
Ruby Issue Tracking System
Ruby master - Feature #17353: Functional chaining operator
https://bugs.ruby-lang.org/issues/17353?journal_id=88823
2020-11-29T18:32:10Z
zverok (Victor Shepelev)
zverok.offline@gmail.com
<ul></ul><p>"Let's take <code>|></code> from Elixir" is proposed roughly once a month. The problem with this proposal is that it doesn't work well with Ruby syntax. Ruby's core chaining module is <code>Enumerable</code> ("core" in the sense it shows how the things are designed here), and core chainable item is block.</p>
<p>So let's look at your example:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="n">requests</span><span class="p">)</span> <span class="o">=</span> <span class="n">requests</span>
<span class="o">|></span> <span class="no">Array</span><span class="p">.</span><span class="nf">filter</span> <span class="p">{</span> <span class="ow">not</span> <span class="n">_1</span><span class="p">.</span><span class="nf">from</span><span class="p">.</span><span class="nf">user</span><span class="p">.</span><span class="nf">banned?</span> <span class="p">}</span>
<span class="o">|></span> <span class="no">Array</span><span class="p">.</span><span class="nf">map</span> <span class="p">{</span> <span class="n">_1</span> <span class="o">|></span> <span class="n">main_router</span><span class="p">.</span><span class="nf">emit</span> <span class="p">}</span>
<span class="o">|></span> <span class="no">Array</span><span class="p">.</span><span class="nf">each</span> <span class="o">&</span><span class="n">awaiter</span>
</code></pre>
<p>There is no way (besides "it is Elegant Because It Is Elegant In Elixir") how exactly it is better than</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="n">requests</span><span class="p">)</span> <span class="o">=</span> <span class="n">requests</span>
<span class="p">.</span><span class="nf">filter</span> <span class="p">{</span> <span class="ow">not</span> <span class="n">_1</span><span class="p">.</span><span class="nf">from</span><span class="p">.</span><span class="nf">user</span><span class="p">.</span><span class="nf">banned?</span> <span class="p">}</span>
<span class="p">.</span><span class="nf">map</span> <span class="p">{</span> <span class="n">main_router</span><span class="p">.</span><span class="nf">emit</span><span class="p">(</span><span class="n">_1</span><span class="p">)</span> <span class="p">}</span>
<span class="p">.</span><span class="nf">each</span> <span class="o">&</span><span class="n">awaiter</span>
</code></pre>
<p>Now, this (one-item chaining):</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">gets</span><span class="p">.</span><span class="nf">to_i</span>
<span class="o">|></span> <span class="n">make_stuff</span>
<span class="o">|></span> <span class="nb">format</span> <span class="s2">"the number is %d"</span>
<span class="o">|></span> <span class="nb">puts</span>
</code></pre>
<p>is handled by <a href="https://ruby-doc.org/core-2.7.0/Object.html#method-i-then" class="external">Object#then</a>, existing since 2.6:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">gets</span><span class="p">.</span><span class="nf">to_i</span>
<span class="p">.</span><span class="nf">then</span><span class="p">(</span><span class="o">&</span><span class="nb">method</span><span class="p">(</span><span class="ss">:make_stuff</span><span class="p">))</span>
<span class="p">.</span><span class="nf">then</span> <span class="p">{</span> <span class="nb">format</span> <span class="s2">"the number is %d"</span><span class="p">,</span> <span class="n">_1</span> <span class="p">}</span>
<span class="p">.</span><span class="nf">then</span><span class="p">(</span><span class="o">&</span><span class="nb">method</span><span class="p">(</span><span class="ss">:puts</span><span class="p">))</span>
</code></pre>
<p>Which is exactly "ideologically compatible" with how Enumerable chaining works, trivially implemented and place nice with all possible Ruby intuitions.</p>
<p>Now, method references and currying is another, sadder, story, but it would be sad with any chaining syntax.</p>
Ruby master - Feature #17353: Functional chaining operator
https://bugs.ruby-lang.org/issues/17353?journal_id=88826
2020-11-29T22:26:34Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul><li><strong>Related to</strong> <i><a class="issue tracker-2 status-5 priority-4 priority-default closed" href="/issues/15799">Feature #15799</a>: pipeline operator</i> added</li></ul>
Ruby master - Feature #17353: Functional chaining operator
https://bugs.ruby-lang.org/issues/17353?journal_id=88828
2020-11-29T22:26:50Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul><li><strong>Related to</strong> <i><a class="issue tracker-2 status-1 priority-4 priority-default" href="/issues/16794">Feature #16794</a>: Rightward operators</i> added</li></ul>
Ruby master - Feature #17353: Functional chaining operator
https://bugs.ruby-lang.org/issues/17353?journal_id=88835
2020-11-30T03:29:31Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul></ul><p>Off topic:</p>
<p>fulcanelly (Maks Kompanienko) wrote:</p>
<blockquote>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="n">requests</span><span class="p">)</span> <span class="o">=</span> <span class="n">requests</span>
<span class="o">|></span> <span class="no">Array</span><span class="p">.</span><span class="nf">filter</span> <span class="p">{</span> <span class="ow">not</span> <span class="n">_1</span><span class="p">.</span><span class="nf">from</span><span class="p">.</span><span class="nf">user</span><span class="p">.</span><span class="nf">banned?</span> <span class="p">}</span>
<span class="o">|></span> <span class="no">Array</span><span class="p">.</span><span class="nf">map</span> <span class="p">{</span> <span class="n">_1</span> <span class="o">|></span> <span class="n">main_router</span><span class="p">.</span><span class="nf">emit</span> <span class="p">}</span>
<span class="o">|></span> <span class="no">Array</span><span class="p">.</span><span class="nf">each</span> <span class="o">&</span><span class="n">awaiter</span>
</code></pre>
</blockquote>
<p>This made me want to disable fluent-dots in endless-def...</p>