From: daniel@...42.com Date: 2020-05-17T21:21:49+00:00 Subject: [ruby-core:98416] [Ruby master Feature#16899] Add method `Array#both_end` Issue #16899 has been updated by Dan0042 (Daniel DeLorme). I think `ary.values_at(0,-1)` does the job pretty well. ---------------------------------------- Feature #16899: Add method `Array#both_end` https://bugs.ruby-lang.org/issues/16899#change-85686 * Author: S_H_ (Shun Hiraoka) * Status: Open * Priority: Normal ---------------------------------------- Add a method that gets both the first and the last elements of an array: `Array#both_end`. ## Current Status Sometimes, we want to get the elements at both ends of an array. But now, no method has this behavior. So, define this method: ```ruby class Array def get_first_and_last(count) [self.first(count), self.last(count)] end end ``` ## Proposal Get the elements at both ends of an array with `Array#both_end`. Implement a new method `Array#both_end` that gets the elements at both ends of an array. ## Array#both_end behavior Normal array: ```ruby ary = [ "w", "x", "y", "z" ] ary.both_end #=> ["w", "z"] ary.both_end(2) #=> [["w", "x"], ["y", "z"] ``` Empty array: ```ruby [].both_end #=> [nil, nil] [].both_end #=> [nil, nil] ``` Argument exceeds the array size: ```ruby ary = [ "w", "x", "y", "z" ] ary.both_end(10) #=> [[ "w", "x", "y", "z" ], [ "w", "x", "y", "z" ]] ``` ## Implementation This implementation uses `Array#asscoc`, `Array#first`, and `Array#last` in C function. ```c static VALUE rb_ary_both_end(int argc, VALUE *argv, VALUE ary) { VALUE first, last; rb_check_arity(argc, 0, 1); if (RARRAY_LEN(ary) == 0) return rb_assoc_new(Qnil, Qnil); first = rb_ary_first(argc, argv, ary); last = rb_ary_last(argc, argv, ary); return rb_assoc_new(first, last); } ``` ## Problem I'm wondering if the following code should raise an error, and if so, what kind of error is the best. Argument exceeds the array size: ```ruby ary = [ "w", "x", "y", "z" ] ary.both_end(10) #=> error can't get both end value! ``` I wonder if this method name (`Array#both_end`) is the best. -- https://bugs.ruby-lang.org/ Unsubscribe: