From: shugo@... Date: 2015-12-17T13:33:00+00:00 Subject: [ruby-core:72214] [Ruby trunk - Bug #11816] Partial safe navigation operator Issue #11816 has been updated by Shugo Maeda. Yusuke Endoh wrote: > > Is it really hard to change after the release of Ruby 2.3? > > As Marc-Andre stated in https://bugs.ruby-lang.org/issues/11816#note-7, it will bring incompatibility. If we may change the spec in future, I think we should explicitly state the possibility in doc and release message. Also, it might be a good idea to mark the feature as "experimental". It would be better if Matz would like to change the behavior in future. > Another idea for the proposal: how about propagating `&.` as long as explicit method chain (that uses `.` literally) continues? > > ~~~~ > x&.foo * 42 == (x&.foo) * 42 > x&.foo.*(42) == (x&.foo&.*(42)) # strictly not equivalent in the case where #foo returns nil > ~~~~ In my understanding, rather than `(x&.foo&.*(42))`, `x&.foo.*(42)` is equivalent to `x && x.foo.*(42)` except when `x` is `false`. So, the phrase "propagating `&.`" is confusing, isn't it? Anyway, your proposal sounds reasonable because `x&.foo * 42` is parsed as `(x && x.foo) * 42` rather than `x && (x.foo * 42)` in my brain. However, the behavior like `(x && x.foo) * 42` seems to be useless for the same reason as the current behavior of `x&.foo.bar`, so there is a trade-off. ---------------------------------------- Bug #11816: Partial safe navigation operator https://bugs.ruby-lang.org/issues/11816#change-55624 * 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: 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 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/