わたなべです.

split(":", n) がまずいわけないですね.

なんかださい方法ですが, char_sep != 0 のときは i = 0;
にしちゃうのが簡単かな.

--- string.c.orig	Fri Feb  7 15:16:05 1997
+++ string.c	Wed Feb 19 16:38:01 1997
@@ -1629,6 +1629,8 @@
     rb_scan_args(argc, argv, "02", &spat, &limit);
     if (!NIL_P(limit)) {
 	lim = NUM2INT(limit);
+	if (lim == 0) limit = Qnil;
+	else if (lim == 1) return ary_new3(1, str);
 	i = 1;
     }
 
@@ -1663,6 +1665,7 @@
 	char *ptr = str->ptr;
 	int len = str->len;
 	char *eptr = ptr + len;
+	i = 0;
 
 	if (char_sep == ' ') {	/* AWK emulation */
 	    int skip = 1;
@@ -1679,8 +1682,8 @@
 		}
 		else {
 		    if (isspace(*ptr)) {
-			ary_push(result, str_substr(str, beg, end-beg));
 			if (!NIL_P(limit) && lim <= ++i) break;
+			ary_push(result, str_substr(str, beg, end-beg));
 			skip = 1;
 			beg = end + 1;
 		    }
@@ -1693,8 +1696,8 @@
 	else {
 	    for (end = beg = 0; ptr<eptr; ptr++) {
 		if (*ptr == char_sep) {
-		    ary_push(result, str_substr(str, beg, end-beg));
 		    if (!NIL_P(limit) && lim <= ++i) break;
+		    ary_push(result, str_substr(str, beg, end-beg));
 		    beg = end + 1;
 		}
 		end++;