From: gotoken@... (GOTO Kentaro) Date: 2000-02-15T22:34:45+09:00 Subject: [ruby-talk:01382] Re: nice sample for functional stuff Hi, In message "[ruby-talk:01378] Re: nice sample for functional stuff" on 00/02/15, Pixel writes: >> > def sum >> > inject(0) {|n, i| n += i } > ^^ why ?? > > inject(0) {|n, i| n + i } > >seems enough to me, uh? Yes. You are right. >uh? your solution gives ([].sum == nil), tis still not the best. mine has the >same problem > >l = [1] >l.sum + 1 #=> 2 > >l.shift >l.sum + 1 #=> Exception > >-> [].sum should raise an exception Well, I didn't expect that the vaule of sum is a numeric then. If I would expect a integer, I specifies explicitly: l.sum.to_i + 1 This is very clear for me. But the following may be liked: def sum(value_for_empty = 0) inject(value_for_empty){|n,i| n+i} end [].sum + 1 #=> 1 [].sum(0) + 1 #=> 1 [].sum([]) + "tail" #=> ["tail"] [].sum("") + "tail" #=> "tail" I can't choose better one though. All I can say is I rather *like* explicit conversion style. >(perl has no such problem as "" is 0 is undef is ... :) I believe I understand what you say, but sometimes such an implicit conversion makes a bug which is not easy to find (at least for me). It is one of favorite points, that is, Ruby's variable is type free but Ruby does not do type conversion unless a user specify that. Thanks, -- gotoken