なかだです。

At Thu, 9 Aug 2007 02:07:54 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:31364]:
> |# Enumerable#cycleが突然追加されたように見えるので理由が気になりました。
> 
> いや、cycle使ってFizzBazz実装してるのを見かけてうらやましくなっ
> ただけです。

じゃついでにString#nonempty?もいれますか?

$ ./ruby -e 'n3, n5 = ([""]*2<<"fizz").cycle, ([""]*4<<"buzz").cycle
1.upto(100){|i|puts "#{n3.next}#{n5.next}".nonempty?||i}'

sub(/\A\z/){i} でもできますけどね。


Index: string.c =================================================================== --- string.c (revision 12905) +++ string.c (working copy) @@ -425,4 +425,22 @@ rb_str_empty(VALUE str) } +/* + * call-seq: + * str.nonempty? => self or nil + * + * Returns <code>self</code> if <i>str</i> is not empty, or <code>nil</code>. + * + * "hello".nonempty? #=> "hello" + * "".nonempty? #=> nil + */ + +static VALUE +rb_str_nonempty(VALUE str) +{ + if (RSTRING_LEN(str) == 0) + return Qnil; + return str; +} + /* * call-seq: @@ -4828,4 +4846,10 @@ sym_empty(VALUE sym) } +static VALUE +sym_nonempty(VALUE sym) +{ + return rb_str_nonempty(rb_id2str(SYM2ID(sym))); +} + static VALUE sym_upcase(VALUE sym) @@ -4911,4 +4935,5 @@ Init_String(void) rb_define_method(rb_cString, "size", rb_str_length, 0); rb_define_method(rb_cString, "empty?", rb_str_empty, 0); + rb_define_method(rb_cString, "nonempty?", rb_str_nonempty, 0); rb_define_method(rb_cString, "=~", rb_str_match, 1); rb_define_method(rb_cString, "match", rb_str_match_m, -1); @@ -5038,4 +5063,5 @@ Init_String(void) rb_define_method(rb_cSymbol, "size", sym_length, 0); rb_define_method(rb_cSymbol, "empty?", sym_empty, 0); + rb_define_method(rb_cSymbol, "nonempty?", sym_nonempty, 0); rb_define_method(rb_cSymbol, "match", sym_match, -1);
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦