[ruby-core:124547] [Ruby Feature#13683] Add strict Enumerable#single
Issue #13683 has been updated by Eregon (Benoit Daloze). @baweaver FYI your reply didn't work on Redmine, it shows an empty comment by Anonymous, so I'd suggest you add on Redmine for future comments to workaround that. The comment is:
I would advocate for using a `!` on the end of whatever we pick to signify it does something "dangerous" (e.g. exception) just as a warning for users.
This is not the case for core methods, core methods only have a `!` if it's a more dangerous version of a non-! method, which is not the case here if we add a single method. ---------------------------------------- Feature #13683: Add strict Enumerable#single https://bugs.ruby-lang.org/issues/13683#change-116116 * Author: dnagir (Dmytrii Nagirniak) * Status: Feedback ---------------------------------------- ### Summary This is inspired by other languages and frameworks, such as LINQ's [Single](https://msdn.microsoft.com/en-us/library/bb155325%28v=vs.110%29.aspx) (pardon MSDN reference), which has very big distinction between `first` and `single` element of a collection. - `first` normally returns the top element, and the developer assumes there could be many; - `single` returns one and only one element, and it is an error if there are none or more than one. We, in Ruby world, very often write `fetch_by('something').first` assuming there's only one element that can be returned there. But in majority of the cases, we really want a `single` element. The problems with using `first` in this case: - developer needs to explicitly double check the result isn't `nil` - in case of corrupted data (more than one item returned), it will never be noticed `Enumerable#single` addresses those problems in a very strong and specific way that may save the world by simply switching from `first` to `single`. ### Other information - we may come with a better internal implementation (than `self.map`) - better name could be used, maybe `only` is better, or a bang version? - re-consider the "block" implementation in favour of a separate method (`single!`, `single_or { 'default' }`) The original implementation is on the ActiveSupport https://github.com/rails/rails/pull/26206 But it was suggested to discuss the possibility of adding it to Ruby which would be amazing. -- https://bugs.ruby-lang.org/
participants (1)
-
Eregon (Benoit Daloze)