From: Brian Adkins Date: 2007-10-26T07:40:13+09:00 Subject: Skip the first invocation e.g. skip_first { foo } Consider the following code: first = true 3.times do if first first = false else puts 'foo' end ... end I'd like to be able to do the following instead: 3.times do skip_first { puts 'foo' } ... end However, I'm pretty sure that's impossible - especially when you consider running the above code twice would require state to be initialized twice, so I expect some initialization outside the loop is necessary. So, what's the most elegant way to solve this? Here are a couple I've come up with minus some implementation details. They work, but I'm not very pleased with either one. I don't recall ever needing 'n' to be other than 1, but it feels strange to not generalize it. I also realize it's more typical to want to execute code only on the first loop invocation, but I had the opposite need when this question arose. # Use an object for state skip_first = SkipN.new(1) 3.times do skip_first.run { puts 'hi' } ... end # Use a closure for state skip_first = skipn(1) 3.times do skip_first.call lambda { puts 'hi' } ... end I experimented with using a binding, but I discovered that a new binding is created each time times invokes the block, so apparently it's not possible to introduce a variable within the lexical scope of the block for the duration of the 3.times invocations - or I missed something. Brian Adkins