From: Morton Goldberg Date: 2007-09-12T14:39:44+09:00 Subject: Re: undefined method `+' for nil:NilClass (NoMeth On Sep 11, 2007, at 8:04 PM, Rob wrote: > I have corrected the class code, > > # This version includes the enumerable module, gaining access > to .collect .inject .each_with_index et al. > class Generator > include Enumerable > > def initialize(start="a", limit=52) > @limit = limit > @start = start > end > > def each > # Dup here otherwise another call to .each later on starts > from where this left off > char = @start.dup @limit.times do > # And dup here otherwise the values returned will point > to the same location > # and .collect would return ["ba", "ba", "ba", ... "ba"] > or whatever the last > # character sequence was. > yield char.dup > char.succ! > end > end > end > > gen = Generator.new > > gen.each { |char| puts char } > > # comma separated string > puts gen.inject { |memo, s| "#{memo},#{s}" } > > # returns array of codes > puts gen.collect It seems to me that you are reinventing the wheel -- in this case 'wheel' being the built-in class Range. Why not do it like this? ('a'..'az').each { |chr| puts chr } ('a'..'az').to_a.join(', ') # => "a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, as, at, au, av, aw, ax, ay, az" ('a'..'az').to_a # => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "aa", "ab", "ac", "ad", "ae", "af", "ag", "ah", "ai", "aj", "ak", "al", "am", "an", "ao", "ap", "aq", "ar", "as", "at", "au", "av", "aw", "ax", "ay", "az"] Regards, Morton