[ruby-core:96587] [Ruby master Misc#16464] Which core objects should support deconstruct/deconstruct_keys?
From:
daniel@...42.com
Date:
2019-12-30 01:31:14 UTC
List:
ruby-core #96587
Issue #16464 has been updated by Dan0042 (Daniel DeLorme).
> 1 in Integer(..0)
>
> "I believe the latter example looks pretty logical "
>
> To me this looks very, very, very strange.
Same here. It looks like trying to convert a beginless range to an Integer. I understand how `Object#deconstruct` would work with the array pattern to allow this, but it feels a bit hacky. An object with `deconstruct` should have some kind of enumerable/tuple-like quality such that it makes sense to represent it as an array.
Given that "Alternative pattern" is represented as `pat | pat | ...`, using `&` like this would look more logical to me:
1 in Integer & ..0
`Time#deconstruct_keys` is pretty obvious indeed.
`Set#deconstruct` might make sense but I think that a Set is usually considered un-ordered? But an array pattern matches in order with the values provided by `deconstruct`, so `Set[1,2,3] in Set[3,2,1]` would be false. Quite a gotcha, no?
----------------------------------------
Misc #16464: Which core objects should support deconstruct/deconstruct_keys?
https://bugs.ruby-lang.org/issues/16464#change-83554
* 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>