From: ruby-core@... Date: 2019-05-27T16:37:02+00:00 Subject: [ruby-core:92865] [Ruby trunk Bug#15880] Wrong precedence of the if modifier in pattern matching Issue #15880 has been updated by marcandre (Marc-Andre Lafortune). Status changed from Open to Rejected This is necessary so the `if` can depend on the variables of the matching, e.g. `in [Integer => x] if x.odd?` ---------------------------------------- Bug #15880: Wrong precedence of the if modifier in pattern matching https://bugs.ruby-lang.org/issues/15880#change-78244 * Author: ibylich (Ilya Bylich) * Status: Rejected * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.7.0dev (2019-05-20 trunk ab0f2deab1) [x86_64-darwin18] * Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- When "If" is used as an "If modifier" it runs before the expression that it wraps: ``` ruby => puts 1 if (puts 2; true) 2 1 ``` However, when it's used in the pattern matching destructuring runs first: ``` ruby class A def deconstruct puts 'deconstruct called' [1] end end p case A.new in A[1] if (puts 'if check'; true) 'yes' else 'no' end # prints # deconstruct called # if check # "yes" ``` I personally think that it's very confusing as it doesn't reflect the code. I assumed it to not run destructuring if the check returns `false` (especially because destructuring is allowed to have side-effects) -- https://bugs.ruby-lang.org/ Unsubscribe: