[#119637] Behavior of raising from rescue blocks when multiple rescue blocks exist — Rodrigo Rosenfeld Rosas via ruby-core <ruby-core@...>
Hello, I couldn't find any documentation about the subject, so I thought
3 messages
2024/10/29
[ruby-core:119383] [Ruby master Feature#20770] A *new* pipe operator proposal
From:
"Dan0042 (Daniel DeLorme) via ruby-core" <ruby-core@...>
Date:
2024-10-01 16:13:21 UTC
List:
ruby-core #119383
Issue #20770 has been updated by Dan0042 (Daniel DeLorme).
I'm not a big fan of this pipe operator idea, but at least the idea of using `it` is a good one; it solves many problems with previous proposals.
```ruby
foo = 42
1 |> foo |> BAR
#foo should be localvar but somehow is parsed as method here?
#BAR should be constant but somehow is parsed as method here?
1 |> foo(it) |> BAR(it)
#at least foo and BAR are recognizably methods
1 |> foo(it, 2)
2 |> foo(1, it)
hash |> BAR(**it)
#also, it allows flexibility in how the argument is passed
```
But that being said, this doesn't seem to be so useful to me. If we compare "before" and "after" the pipe operator:
```ruby
#current
client_api_url
.then{ URI.parse(it) }
.then{ Net::HTTP.get(it) }
.then{ JSON.parse(it).fetch(important_key) }
#with |> syntax sugar
client_api_url
|> URI.parse(it)
|> Net::HTTP.get(it)
|> JSON.parse(it).fetch(important_key)
```
It really doesn't seem to me that readability is increased in any meaningful way. The benefit seems way too low to justify adding new syntax.
Languages with the pipe operator all have first-class functions (afaik); the two kinda go together. But Ruby doesn't have first-class functions so the usefulness of the pipe operator will inevitably be very limited.
If the pipe operator is introduced I think it should behave similarly to other languages, where the RHS is a callable object. In fact if we define the pipe operator as invoking #call or #bind_call on the RHS, I could see the beginning of a feature that is more useful than just syntax sugar.
```ruby
str |> JSON.method(:parse)
1 |> Object.instance_method(:to_s) #=> "#<Integer:0x0000000000000003>"
#and now we just need nice shorthands for Mod.method(:name) and Mod.instance_method(:name) ;-)
```
----------------------------------------
Feature #20770: A *new* pipe operator proposal
https://bugs.ruby-lang.org/issues/20770#change-110000
* Author: AlexandreMagro (Alexandre Magro)
* Status: Open
----------------------------------------
Hello,
This is my first contribution here. I have seen previous discussions around introducing a pipe operator, but it seems the community didn't reach a consensus. I would like to revisit this idea with a simpler approach, more of a syntactic sugar that aligns with how other languages implement the pipe operator, but without making significant changes to Ruby's syntax.
Currently, we often write code like this:
```ruby
value = half(square(add(value, 3)))
```
We can achieve the same result using the `then` method:
```ruby
value = value.then { add(_1, 3) }.then { square(_1) }.then { half(_1) }
```
While `then` helps with readability, we can simplify it further using the proposed pipe operator:
```ruby
value = add(value, 3) |> square(_1) |> half(_1)
```
Moreover, with the upcoming `it` feature in Ruby 3.4 (#18980), the code could look even cleaner:
```ruby
value = add(value, 3) |> square(it) |> half(it)
```
This proposal uses the anonymous block argument `(_1)`, and with `it`, it simplifies the code without introducing complex syntax changes. It would allow us to achieve the same results as in other languages that support pipe operators, but in a way that feels natural to Ruby, using existing constructs like `then` underneath.
I believe this operator would enhance code readability and maintainability, especially in cases where multiple operations are chained together.
Thank you for considering this proposal!
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/