[ruby-core:124541] [Ruby Feature#13683] Add strict Enumerable#single
Issue #13683 has been updated by Dan0042 (Daniel DeLorme). @byroot it depends on the use case. Yes sometimes it's an assertion that should raise an error, but at other times we want to find the single element, and do something **only if** found, not raise an error. @ufuk the same way you disambiguate when #find returns nil. Or #delete or #delete_at or #[] or #bsearch or #first, etc. In other words Ruby is designed so that nil is equivalent to undefined and this is the way it normally works for any method that returns one of the elements of the collection. And as I said I'm not against having both return-nil and raise-error versions, but I do consider that return-nil is the more relevant one. ---------------------------------------- Feature #13683: Add strict Enumerable#single https://bugs.ruby-lang.org/issues/13683#change-116109 * 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)
-
Dan0042 (Daniel DeLorme)