[#7968] array .{first, last, at} — Kazunori NISHI <kazunori@...>

西@九大です。

25 messages 1999/10/07
[#7969] Re: array .{first, last, at} — nobu.nakada@... 1999/10/07

なかだです。

[#7983] Re: array .{first, last, at} — Kazunori NISHI <kazunori@...> 1999/10/12

西@九大です。

[#7984] Re: array .{first, last, at} — matz@... (Yukihiro Matsumoto) 1999/10/12

まつもと ゆきひろです

[#7985] [patch] Array#delete_at w/ minus value — EGUCHI Osamu <eguchi@...> 1999/10/12

えぐち@エスアンドイーです。

[ruby-dev:7968] array .{first, last, at}

From: Kazunori NISHI <kazunori@...>
Date: 1999-10-07 08:21:45 UTC
List: ruby-dev #7968
西@九大です。

配列の先頭と末尾を参照するメソッドが欲しいです。

first = (object .to_a)[0]
last  = (object .to_a)[-1]

よりも

first = object .to_a .first
last  = object .to_a .last

の方が読みやすいと思います。


user = (mail_addr .split('@'))[0]

みたいな場合も、split まで書いた時点で、あー、前に戻って'('を打つのが
面倒だー、

user = mail_addr .split('@') .first

とかやりてー。とよく思います。(可読性じゃなかったの?)

こういう場合、{pop, shift} で大丈夫なのですが、
  * 配列を破壊したくない
  * メッセージで何とかしたい
  * でも、array .dup .pop は高価過ぎるよー
という経験がよくあります。とても欲しいです。

イメージ的には、

class Array
  alias at []
  def first (index = 0)
    self[index]
  end
  def last (index = 0)
    self[self .size - index]
  end
end

みたいな感じです。最悪 .at だけでもあると嬉しいです。
どうでしょうか?

------------------------------------------------------------------
九州大学大学院システム情報科学研究科 情報工学専攻 博士後期課程三年
      西 和則   ( e-mail: kazunori@swlab.csce.kyushu-u.ac.jp )
------------------------------------------------------------------
#とりあえず、パッチを作ってみました。

*** array.c.orig	Fri Aug 13 14:45:02 1999
--- array.c	Thu Oct  7 17:13:34 1999
***************
*** 417,422 ****
--- 417,450 ----
  }
  
  static VALUE
+ rb_ary_aref_method(argc, argv, ary)
+     int argc;
+     VALUE *argv;
+     VALUE ary;
+ {
+     if (argc == 0)
+       return rb_ary_entry(ary, 0);
+ 
+     return rb_ary_aref(argc, argv, ary);
+ }
+ 
+ static VALUE
+ rb_ary_aref_last(argc, argv, ary)
+     int argc;
+     VALUE *argv;
+     VALUE ary;
+ {
+     VALUE arg1;
+     long offset;
+ 
+     if (rb_scan_args(argc, argv, "01", &arg1) == 0)
+       return rb_ary_entry(ary, -1);
+ 
+     offset = - (NUM2LONG(arg1) + 1);
+     return rb_ary_entry(ary, offset);
+ }
+ 
+ static VALUE
  rb_ary_index(ary, val)
      VALUE ary;
      VALUE val;
***************
*** 1444,1449 ****
--- 1472,1480 ----
      rb_define_method(rb_cArray, "===", rb_ary_equal, 1);
  
      rb_define_method(rb_cArray, "[]", rb_ary_aref, -1);
+     rb_define_alias(rb_cArray,  "at", "[]");
+     rb_define_method(rb_cArray, "first", rb_ary_aref_method, -1);
+     rb_define_method(rb_cArray, "last", rb_ary_aref_last, -1);
      rb_define_method(rb_cArray, "[]=", rb_ary_aset, -1);
      rb_define_method(rb_cArray, "concat", rb_ary_concat, 1);
      rb_define_method(rb_cArray, "<<", rb_ary_push, 1);

In This Thread

Prev Next