我正在使用此代码让用户输入名称,而程序将它们存储在一个数组中,直到它们输入一个空字符串(他们必须在每个名称后按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
end while
由Ruby的作者Matz的拒绝.相反,他建议使用Kernel#loop
,例如
loop do # some code here break ifend
有关详细信息,请参阅:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745(或通过韦巴克),和这个wiki:HTTP:// rosettacode.组织/维基/循环/不要同时#红宝石
我
Tempfile#initialize
在Ruby核心库中读取源代码时发现了以下片段: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 Archive和Ruby Buzz论坛中找到. - 蜥蜴
像这样:
people = [] begin info = gets.chomp people += [Person.new(info)] if not info.empty? end while not info.empty?
参考:Ruby的Hidden do {} while()循环
这个怎么样?
people = [] until (info = gets.chomp).empty? people += [Person.new(info)] end
这是hubbardr与博客死链接的全文文章.
我Tempfile#initialize
在Ruby核心库中读取源代码时发现了以下片段:
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
虽然我很高兴再也看不到这个成语,但是begin...end
非常强大.以下是记忆没有参数的单线方法的常用习语:
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
这现在正常工作:
begin # statment end until
但是,它可能在将来删除,因为该begin
陈述是违反直觉的.见:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745
Matz建议这样做:
loop do # ... break ifend
从我收集的内容来看,Matz不喜欢这个结构
beginend while
因为,它的语义不同于
while
因为第一个构造在检查条件之前首先执行代码,第二个构造在执行代码之前首先测试条件(如果有的话).我认为Matz更喜欢保留第二个结构,因为它匹配if语句的一个行结构.
即使对于if语句,我也从不喜欢第二种结构.在所有其他情况下,计算机从上到下执行从左到右的代码(例如||和&&).人类从上到下从左到右阅读代码.
我建议改为以下结构:
ifthen # matches case-when-then statement while then while begin end while # or something similar but left-to-right
我不知道这些建议是否会用其他语言进行解析.但在任何情况下,我都倾向于保持从左到右的执行以及语言的一致性.