Ruby中有“do ... while”循环吗?

我使用这段代码让用户输入名字,而程序将它们存储在一个数组中,直到它们输入一个空字符串(它们必须在每个名称之后按回车):

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

这段代码在do ... while循环中看起来会更好:

people = []

do
    info = gets.chomp
    people += [Person.new(info)] if not info.empty?
while not info.empty?

在这段代码中,我不必将信息分配给一些随机字符串。

不幸的是,这种类型的循环似乎并不存在于Ruby中。 任何人都可以提出一个更好的方法来做到这一点?


小心

Ruby的作者Matz拒绝了begin <code> end while <condition>被拒绝。 相反,他建议使用Kernel#loop ,例如

loop do 
  # some code here
  break if <condition>
end 

有关更多详细信息,请参阅:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745(或通过Wayback)以及此wiki:http:// rosettacode。组织/维基/循环/不要同时#红宝石


最初由Jeremy Voorhis撰写。 内容已被复制,因为它似乎已从原始网站中删除。 副本也可以在Web Archive和Ruby Buzz Forum中找到。 - 蜥蜴

在读取Ruby核心库中的Tempfile#initialize源代码时,我找到以下代码片段:

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)

乍一看,我认为while修饰符会在begin ... end的内容之前被评估,但事实并非如此。 注意:

>> begin
?>   puts "do {} while ()" 
>> end while false
do {} while ()
=> nil

正如你所期望的那样,当修饰符为真时,循环将继续执行。

>> n = 3
=> 3
>> begin
?>   puts n
>>   n -= 1
>> end while n > 0
3
2
1
=> nil

虽然我很乐意再也看不到这个成语,但开始......结束是相当强大的。 以下是一个常用的方法来记忆没有参数的单线程方法:

def expensive
  @expensive ||= 2 + 2
end

这是一个丑陋的,但快速的方式来记忆更复杂的东西:

def expensive
  @expensive ||=
    begin
      n = 99
      buf = "" 
      begin
        buf << "#{n} bottles of beer on the walln" 
        # ...
        n -= 1
      end while n > 0
      buf << "no more bottles of beer" 
    end
end

喜欢这个:

people = []

begin
  info = gets.chomp
  people += [Person.new(info)] if not info.empty?
end while not info.empty?

参考:Ruby的隐藏do {} while()Loop

链接地址: http://www.djcxy.com/p/97055.html

上一篇: Is there a "do ... while" loop in Ruby?

下一篇: Defining a variable with or without export