Issue #16464 has been updated by shevegen (Robert A. Heiler).


I think when possible every object should support deconstructing IF
it makes sense. If it walks like a duck, talks like a duck, then it
can be dequacked (deconstructed like a duck).

I guess one question may be how useful something it is, whether there
is an actual use case or not - people to use that. Perhaps it may be
better to see and wait for (several) people who really had a use
case to do so and evaluate again in a few months.

    1 in Integer(..0)

"I believe the latter example looks pretty logical "

To me this looks very, very, very strange.

Is that still ruby at all? :P

I guess it follows from a logical continuation, e. g. " if
x in y" works, and "beginless ranges" work, then the above
should work too. But the syntax is so strange - I wonder
if I am the only one feeling about that so if that is the
case I'll happily quiet down. But to my eyes it looks very
strange.

----------------------------------------
Misc #16464: Which core objects should support deconstruct/deconstruct_keys?
https://bugs.ruby-lang.org/issues/16464#change-83478

* Author: zverok (Victor Shepelev)
* Status: Open
* Priority: Normal
* Assignee: 
----------------------------------------
Now, when pattern matching is out, I believe it is worth discussing which core and standard library objects should be matchable "out of the box".

My proposals, as of now, are:

**1. `Object#deconstruct`, returning `[self]`.**

Justification:
```ruby
# this works:
1 in Integer
# this works:
1 in ..0
# this does NOT:
1 in Integer(..0)
# NoMatchingPatternError (1)
```
I believe the latter example looks pretty logical (and can be used in some flexible methods like "if it is a positive integer, it is index in the array, if it is negative integer, it is backward index, and if it is float, it should be calculated as a mean of nearby elements")

**2. `Time#deconstruct_keys`**

Justification is obvious:

```ruby
case created_at
when year: 2019, month: 11..12 => m, day:
  p "Created at #{day}.#{m} this year"
else
  # ...
end
```
(Probably the same for `Date` and `DateTime`)

**3. `Set#deconstruct`**

Seems "logical" as set is a sequence, but I can't think of a good realistic example :)



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