From: Ross Bamford Date: 2006-03-02T01:48:56+09:00 Subject: Re: Indexing system - ruby newbie On Thu, 2006-03-02 at 01:42 +0900, Peter Ertl wrote: > how about that? > > (n < 1) ? "_" : (("A"[0] + n).chr) > > n = 12 > > M > n = 27 > \ OP wanted: ... 24 25 26 27 28 29 ... ... 'X', 'Y', 'Z', 'AA', 'AB', 'AC' ... > > > > --- Urspr端ngliche Nachricht --- > > Von: Ross Bamford > > An: ruby-talk@ruby-lang.org (ruby-talk ML) > > Betreff: Re: Indexing system - ruby newbie > > Datum: Thu, 2 Mar 2006 01:37:06 +0900 > > > > On Thu, 2006-03-02 at 00:14 +0900, Adam Groves wrote: > > > Dear Ross, > > > > > > it works a treat but I'm having a bit of trouble figuring out what's > > > going on. > > > > > > (n < 1) ? '_' : (1...n).inject("A") { |curr, i| curr.succ } > > > > > > I get this: > > > if n<1 > > > '_' > > > else > > > > > > But I'm stuck here. > > > > > > (1...n).inject("A") { |curr, i| curr.succ} > > > > > > I still can't quite get my head around blocks beyond .each do |x| > > > > Inject is real easy, and very handy. It's just like 'each', except it > > also allows the result of the previous iteration to be injected via the > > first argument. For the first iteration, you provide the initial result. > > > > For example: > > > > a = [1,2,3,4,5] > > > > a.inject(0) { |sum, i| sum + i } > > # => 15 > > > > What happens is: > > > > Block is called with sum = 0, i = 1 > > Block returns 1 > > Block is called with sum = 1, i = 2 > > Block returns 3 > > Block is called with sum = 3, i = 3 > > Block returns 6 > > Block is called with sum = 6, i = 4 > > Block returns 10 > > Block is called with sum = 10, i = 5 > > Block returns 15 > > No more elements, so inject returns 15. > > > > In Ruby, inject allows you to omit the initial value, in which case the > > first _two_ elements from the enumerable are passed to the first > > iteration, with things proceeding as above from there, so I could have > > written: > > > > a.inject { |sum, i| sum + i } > > > > And would have: > > > > Block is called with sum = 1, i = 2 > > Block returns 3 > > Block is called with sum = 3, i = 3 > > Block returns 6 > > . > > . > > etc. > > > > You can use inject for much more than just summing stuff up. Comes in > > very handy for these cryptic one-lines (even if you have to 'misuse' it > > a bit occasionally). > > > > -- > > Ross Bamford - rosco@roscopeco.REMOVE.co.uk > > > > > > -- > This email has been verified as Virus free > Virus Protection and more available at http://www.plus.net -- Ross Bamford - rosco@roscopeco.REMOVE.co.uk