Ruby中有「do ... while」循環嗎?

我正在使用此代碼讓用戶輸入名稱,而程序將它們存儲在一個數組中,直到它們輸入一個空字符串(他們必須在每一個名稱後按Enter鍵): web

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中彷佛不存在這種類型的循環。 任何人均可以建議一個更好的方法嗎? jsp


#1樓

當心oop

begin <code> end while <condition>被Ruby的做者Matz拒絕。 相反,他建議使用Kernel#loop ,例如 網站

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

這是2005年11月23日的電子郵件交換 ,Matz聲明: this

|> Don't use it please.  I'm regretting this feature, and I'd like to
|> remove it in the future if it's possible.
|
|I'm surprised.  What do you regret about it?

Because it's hard for users to tell

  begin <code> end while <cond>

works differently from

  <code> while <cond>

RosettaCode wiki有相似的故事: spa

2005年11月,Ruby的建立者Yukihiro Matsumoto對這個循環功能表示遺憾並建議使用Kernel#loop。 code


#2樓

我在Ruby核心庫中讀取Tempfile#initialize的源代碼時發現瞭如下片斷: rem

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

正如您所料,循環將在修飾符爲true時繼續執行。

>> 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 wall\\n" # ... n -= 1 end while n > 0 buf << "no more bottles of beer" end end

最初由Jeremy Voorhis編寫。 內容已在此處複製,由於它彷佛已從原始網站中刪除。 副本也能夠在Web ArchiveRuby Buzz論壇中找到 - 蜥蜴


#3樓

像這樣:

people = []

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

參考: Ruby的Hidden do {} while()循環


#4樓

這個怎麼樣?

people = []

until (info = gets.chomp).empty?
  people += [Person.new(info)]
end

#5樓

這如今正常工做:

begin
    # statment
end until <condition>

可是,它可能在未來被刪除,由於begin語句是違反直覺的。 見: http//blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745

Matz(Ruby的建立者)建議這樣作:

loop do
    # ...
    break if <condition>
end
相關文章
相關標籤/搜索