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