2015-05-24 26 views
2
irb(main):186:0* begin puts "abc" end while false 
abc 
=> nil 
irb(main):187:0> puts "abc" while false 
=> nil 

因此,当您使用带有while修饰符的块时,该块将执行一次(这似乎是许多其他语言中的do-while循环)。但是,如果您使用while修饰符的单个语句,则它更像是一个while循环,其中首先检查条件。这寻求一种令人惊讶的行为为什么存在?为什么修饰符与块的行为不同?

+0

在执行条件后的第一考虑,如果它不是,什么会发生像'放foo除非真正'的陈述。如果在它后缀的语句之前未评估条件,则单行语法根本不起作用。 –

+0

我发现这个:https://blog.newrelic.com/2014/11/13/weird-ruby-begin-end/这导致了http://blade.nagaokaut.ac.jp/cgi-bin/scat。 rb/ruby​​/ruby​​-core/6745其中Matz自己说:“我很遗憾这个功能,如果可能的话,我想在将来删除它。” – matt

+0

@matt所以基本上“这是一个坏主意”。也许你应该回答,因为它或多或少地回答了这个问题。 – Jamie

回答

1

这似乎只是一个语言的怪癖。 ... while condition作为语句修饰符,除了,它位于begin ... end之后,其行为与其他语言的do ... while循环相同。

Yukihiro Matsumoto(Matz,Ruby的创造者)有said he regrets this, and would like to remove this behaviour in the future if possible

有来自New Relic的,在那里我找到了链接到邮件列表后这个博客帖子多一点信息:https://blog.newrelic.com/2014/11/13/weird-ruby-begin-end/

1

我觉得你的困惑在于事实begin/endis not considered a block。要使用块展示你的榜样,在此我们来看一看:

[3] pry(main)> loop { puts "hi" } while false 
=> nil 
+0

无论实施情况如何,看起来这两个人的行为方式看起来几乎一样。 – Jamie

+0

你在质疑两个不同对象的实现,很难不引起注意。 – Anthony

1

做,当确保至少一个执行,但第二个是不是做的同时,是红宝石的许多sintax糖之一。它相当于

while false 
    puts 'abc' 
end 

只记得

puts 'abc' if false 

两者都是正确behaviouring。

+0

这并不能解释为什么这些类似的结构行为不同,尽管 – Jamie

+0

它们看起来很相似,但它们并不相同。第一个是做,而第二个只是为了方便而在一行中声明。 –

相关问题