[ruby-core:74992] [Ruby trunk Bug#11816] Partial safe navigation operator

From: matthew@...
Date: 2016-04-18 01:11:06 UTC
List: ruby-core #74992
Issue #11816 has been updated by Matthew Kerwin.


I don't necessarily disagree with the rest of Joan's post, but for this point:

Joan Blackmoore wrote:
> 
> It may also be taken into the consideration a little inconsistency when followed by operator method:
> 
> optional dot omitted
> `40+2  # 42`
> `40&.+2  # 42`
> 
> vs
> 
> `40.+2 # 42` 
> `40&..+2  # syntax error`

That's perhaps not the right consistency to be searching for; the `&.` operator is a dressed up `.` operator. There's no equivalent sugar-coated safe operator syntax.

~~~ruby
40 + 2  # "unsafe"
#???    # "safe"

40.+2   # "unsafe"
40&.+2  # "safe"
~~~

----------------------------------------
Bug #11816: Partial safe navigation operator
https://bugs.ruby-lang.org/issues/11816#change-58118

* Author: Marc-Andre Lafortune
* Status: Open
* Priority: Normal
* Assignee: Yukihiro Matsumoto
* ruby -v: preview 2
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
I'm extremely surprised (and disappointed) that, currently:

```ruby
x = nil
x&.foo.bar # => NoMethodError: undefined method `bar' for nil:NilClass
```

To make it safe, you have to write `x&.foo&.bar`. But if `foo` is never supposed to return `nil`, then that code isn't "fail early" in case it actually does. `nil&.foo.bar` is more expressive, simpler and is perfect if you want to an error if `foo` returned `nil`. To actually get what you want, you have to resort using the old form `x && x.foo.bar`...

In CoffeeScript, you can write `x()?.foo.bar` and it will work well, since it gets compiled to

```js
if ((_ref = x()) != null) {
  _ref.foo.bar;
}
```

All the discussion in #11537 focuses on `x&.foo&.bar`, so I have to ask:

Matz, what is your understanding of `x&.foo.bar`?

I feel the current implementation is not useful and should be changed to what I had in mind. I can't see any legitimate use of `x&.foo.bar` currently.




-- 
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>

In This Thread

Prev Next