From: twifkak@... Date: 2005-07-20T05:36:46+09:00 Subject: Re: Regarding rand > Thanks guys, > > Daniel, I started out with something similar to that, although yours > is alot better, but then thought it would be nice to have something > like random 'a'..'z' aswell or even random Thing.new(1)..Thing.new(6) > . Which i'll probably not need anyway so i'll 'borrow' yours if I may. Ha! I had to ri Range to actually find out how it supported Ranging Things. Now I know. That's neat. > Devin, thanks, 1) will do!, i'm going to go and have a look at the > pickaxe to see why. Yes, singleton methods are the elixir of life. > 2) I was vaguely aware that creating the arrays > could be a bad idea for big ranges but couldn't work out how to get > the nth member of a range except by doing something like > > value = range.first > for 1..n > value = value.succ > end Yeah, that's probably right. I imagine Range#each looks like this class Range def each value = self.first loop do yield value break if value == self.last value = value.succ end end end > which seemed a bit nasty or by getting the entries which seemed quite > nice in light of the chapter I read about duck typing Yeah, I guess don't bother changing it until you need to get a random thing from a very large Range, in which case, you might want to provide further optimizations for things like Integer. You can still have fun with duck typing my way, though! class Range def rand if self.first.respond_to? :rand_to self.first.rand_to(self.last) else # normal implementation goes here end end end class Array def rand # normal implementation goes here end end class Integer def rand_to(last) self + rand(last - self) end end ... foo.rand #where foo is whatever > Ben (Ruby Newbie) Oh, but the good kind. The kind that's not afraid to dive deep into the language features. (Honestly, I fall under RubyNuby compared to most of the people on this list. I'm just vocal for the time being.) Devin