Project

General

Profile

Feature #16899

Add method `Array#both_end`

Added by S_H_ (Shun Hiraoka) 6 months ago. Updated 6 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:98411]

Description

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:

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:

ary = [ "w", "x", "y", "z" ]
ary.both_end     #=> ["w", "z"]
ary.both_end(2)  #=> [["w", "x"], ["y", "z"]

Empty array:

[].both_end    #=> [nil, nil]
[].both_end    #=> [nil, nil]

Argument exceeds the array size:

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.

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:

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.

Updated by shan (Shannon Skipper) 6 months ago

I think #both_ends reads better in the plural form. Or #first_last harkens to #min_max and is unambiguous. Other options might be #extremes or #bookends.

I'd vote #first_last.

Updated by shevegen (Robert A. Heiler) 6 months ago

I think #first_last would be a better name as well; primary reason being that we
already have #first and #last.

I am also ok with the proposal itself, although I think I have not had a need to
use this often. But I don't mind such a method existing.

#extremes is a bit of a strange name though. It reminds me of mathematics.

#bookends for some reason reminds me of a bookworm - no idea why. :)

#both_end and #both_ends are a bit strange as names. I think one problem here
is that the name implies "ends", but we also have #first and #last, and I am
not sure if both first, and last, can be considered as two ends? What about
circular arrays? :P

So I think #first_last would be a better name. (A single name might be better
but it is harder to find a goot name there.)

#3

Updated by sawa (Tsuyoshi Sawada) 6 months ago

  • Description updated (diff)
  • Subject changed from Proposal: Add Array#both_end method to Add method `Array#both_end`

Updated by Dan0042 (Daniel DeLorme) 6 months ago

I think ary.values_at(0,-1) does the job pretty well.

Updated by shyouhei (Shyouhei Urabe) 6 months ago

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

Updated by S_H_ (Shun Hiraoka) 6 months ago

Thanks for feedbacks.

shan (Shannon Skipper) wrote in #note-1:

I think #both_ends reads better in the plural form. Or #first_last harkens to #min_max and is unambiguous. Other options might be #extremes or #bookends.

I'd vote #first_last.

shevegen (Robert A. Heiler) wrote in #note-2:

I think #first_last would be a better name as well; primary reason being that we
already have #first and #last.

I am also ok with the proposal itself, although I think I have not had a need to
use this often. But I don't mind such a method existing.

#extremes is a bit of a strange name though. It reminds me of mathematics.

#bookends for some reason reminds me of a bookworm - no idea why. :)

#both_end and #both_ends are a bit strange as names. I think one problem here
is that the name implies "ends", but we also have #first and #last, and I am
not sure if both first, and last, can be considered as two ends? What about
circular arrays? :P

So I think #first_last would be a better name. (A single name might be better
but it is harder to find a goot name there.)

#first_last is good name. I use this name.

shyouhei (Shyouhei Urabe) wrote in #note-5:

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

OK, I'll started create gem to Array#first_last and other useful methods implmented.

Thanks.

Also available in: Atom PDF