From: shyouhei@... Date: 2018-01-25T07:37:00+00:00 Subject: [ruby-core:85102] [Ruby trunk Feature#14392] Pipe operator Issue #14392 has been updated by shyouhei (Shyouhei Urabe). dsferreira (Daniel Ferreira) wrote: > shyouhei (Shyouhei Urabe) wrote: > > > Is it really worth adding a new syntax to replace private def... ? > > For me it is Shyouhei. > Like I said before, I care a lot about the visibility of my methods. > The clear definition of each interface and its preservation over time it is a top concern in my architectural work. > The interface integrity is this way guaranteed by a strict rule deeming that every method has its own access modifier set. > This applies to `public`, `protected` and `private`. > Naming is hard and very important and the API resembles that. It is sweat printed in. (Just to try to express my emotions about this) > > We are talking about hundreds to not say thousands of method name duplications that I have in my code base currently. > I don't mind having the extra work but I'm not everybody. To be clear I am not against specifying method visibility. > Now, why do I require the visibility being set after the method definition? > Because I order my methods alphabetically and I don't want to order them by visibility. > By using: `"private def ..."` alphabetical order based on method name makes little sense to my mind. Don't you have difficulties writing elixir code then? They, too, don't take visibilities at the last. > I code ruby because of its elegance and fluidity so I always strive to write code that makes sense to my eyes. > > The proposal of the pipe operator makes perfect sense to me because it resembles my bash memories and it comes as natural as a no brainer. If you prefer sound visibility specifiers rather than implicit ones, I think that a visibility of a method shall be placed somewhere near the method name. By placing private after the end of a method body, that specifier should become too hard to find out the corres[onding method name. To me, def ... end |> private seems far less "fluent" than private def ... ---------------------------------------- Feature #14392: Pipe operator https://bugs.ruby-lang.org/issues/14392#change-69814 * Author: dsferreira (Daniel Ferreira) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- I would like to see implemented in ruby a pipe operator as we have in elixir. An example of application I have in mind is this: ```ruby class Foo def bar(var) puts ���Hello #{var}!��� end |> private def baz(arg) bar(arg) end end foo = Foo.new foo.baz("Fred") # => "Hello Fred!" ``` It can also help simplify method chains: ```ruby class Secret def initialise(user, password) @user = user @password = password end def second_pass(encrypted_string) encrypted_string.chain_4.chain_5.chain_6 end |> private ## # Super encryption def super_encryption @password.chain_1.chain_2.chain_3 |> second_pass end |> public end ``` And also simplify codes like this: ```ruby class Foo def bar(*args) baz = args.select { |arg| arg =~ /regex/ }.first good?(baz) end public :bar def good(arg) arg.to_s.size > 10 end private :good end ``` to become: ```ruby class Foo ## # Bar public method. def bar(*args) args.select { |arg| arg =~ /regex/ }.first |> good? end |> public def good(arg) arg.to_s.size > 10 end |> private end ``` Lots of local variables would be saved and I would expect some performance improvements with that. -- https://bugs.ruby-lang.org/ Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>