<p>I'm using this code to let the user enter in names while the program stores them in an array until they enter an empty string (they must press enter after each name):</p>

<pre><code>people = []
info = 'a' # must fill variable with something, otherwise loop won't execute

while not info.empty?
    info = gets.chomp
    people += [Person.new(info)] if not info.empty?
end
</code></pre>

<p>This code would look much nicer in a do ... while loop:</p>

<pre><code>people = []

do
    info = gets.chomp
    people += [Person.new(info)] if not info.empty?
while not info.empty?
</code></pre>

<p>In this code I don't have to assign info to some random string.</p>

<p>Unfortunately this type of loop doesn't seem to exist in Ruby. Can anybody suggest a better way of doing this?</p>

I found the following snippet while reading the source for
```
Tempfile#initialize
```
in the Ruby core library:
```
```
begin
  tmpname = File.join(tmpdir, make_tmpname(basename, n))
  lock = tmpname + '.lock'
  n += 1
end while @@cleanlist.include?(tmpname) or
  File.exist?(lock) or File.exist?(tmpname)
```
```
At first glance, I assumed the while modifier would be evaluated before the contents of begin...end, but that is not the case. Observe:
```
```
>> begin
?>   puts "do {} while ()" 
>> end while false
do {} while ()
=> nil
```
```
As you would expect, the loop will continue to execute while the modifier is true.
```
```
>> n = 3
=> 3
>> begin
?>   puts n
>>   n -= 1
>> end while n > 0
3
2
1
=> nil
```
```
While I would be happy to never see this idiom again, begin...end is quite powerful. The following is a common idiom to memoize a one-liner method with no params:
```
```
def expensive
  @expensive ||= 2 + 2
end
```
```
Here is an ugly, but quick way to memoize something more complex:
```
```
def expensive
  @expensive ||=
    begin
      n = 99
      buf = "" 
      begin
        buf << "#{n} bottles of beer on the wall\n" 
        # ...
        n -= 1
      end while n > 0
      buf << "no more bottles of beer" 
    end
end
```
```
Originally written by
Jeremy Voorhis
.  The content has been copied here because it seems to have been taken down from the originating site.  Copies can also be found in the
Web Archive
and at
Ruby Buzz Forum
.  -Bill the Lizard