我使用这段代码让用户输入名称,而程序将它们存储在一个数组中,直到他们输入一个空字符串(他们必须在每个名称后按enter):
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中似乎不存在这种类型的循环。谁能提出一个更好的方法来做这件事?
据我所知,马茨不喜欢这种说法
begin
<multiple_lines_of_code>
end while <cond>
因为它的语义是不同的
<single_line_of_code> while <cond>
第一个构造在检查条件之前先执行代码,
第二个构造在执行代码(如果有的话)之前先测试条件。我认为Matz更喜欢保留第二个结构,因为它匹配if语句的一行结构。
我从来不喜欢第二个结构,即使是if语句。在所有其他情况下,计算机
从左到右执行代码(例如;||和&&)从上到下。人类从左到右阅读代码
全面。
我建议使用以下结构:
if <cond> then <one_line_code> # matches case-when-then statement
while <cond> then <one_line_code>
<one_line_code> while <cond>
begin <multiple_line_code> end while <cond> # or something similar but left-to-right
我不知道这些建议是否能与语言的其余部分一起解析。但是无论如何
我更喜欢保持从左到右的执行以及语言的一致性。
警告:
开始<代码>结束时<条件>被Ruby的作者Matz拒绝。相反,他建议使用Kernel#循环,例如:
loop do
# some code here
break if <condition>
end
以下是Matz在2005年11月23日的一封电子邮件交流:
|> 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上也有类似的故事:
在2005年11月期间,Ruby的创建者松本幸弘(Yukihiro Matsumoto)后悔了这个循环特性,并建议使用Kernel#loop。