Issue #16899 has been updated by shyouhei (Shyouhei Urabe).


Why not start as a gem?  There are things not possible without core changes, but it seems this requested feature needs no such things.

----------------------------------------
Feature #16899: Add method `Array#both_end`
https://bugs.ruby-lang.org/issues/16899#change-85691

* 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: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>