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循环,其中首先检查条件。这寻求一种令人惊讶的行为为什么存在?为什么修饰符与块的行为不同?
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循环,其中首先检查条件。这寻求一种令人惊讶的行为为什么存在?为什么修饰符与块的行为不同?
这似乎只是一个语言的怪癖。 ... 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/
我觉得你的困惑在于事实begin/end
is not considered a block。要使用块展示你的榜样,在此我们来看一看:
[3] pry(main)> loop { puts "hi" } while false
=> nil
做,当确保至少一个执行,但第二个是不是做的同时,是红宝石的许多sintax糖之一。它相当于
while false
puts 'abc'
end
只记得
puts 'abc' if false
两者都是正确behaviouring。
这并不能解释为什么这些类似的结构行为不同,尽管 – Jamie
它们看起来很相似,但它们并不相同。第一个是做,而第二个只是为了方便而在一行中声明。 –
在执行条件后的第一考虑,如果它不是,什么会发生像'放foo除非真正'的陈述。如果在它后缀的语句之前未评估条件,则单行语法根本不起作用。 –
我发现这个: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
@matt所以基本上“这是一个坏主意”。也许你应该回答,因为它或多或少地回答了这个问题。 – Jamie