作者zero00072 (zero00072)
站内Ruby
标题Re: [问题] ruby的bug?
时间Tue Sep 11 13:05:47 2012
※ 引述《ireullin (raison detre)》之铭言:
: 请问一下各位
: 小弟使用的是ruby 1.9.3 on windows 7
: 执行下面程式两段程式码理应会得到相同结果
: 可是第一段却会一直列印出"next"
: 而无法结束
: 请问这是ruby的bug吗
: # 这个会陷入无限回圈
: Dir.foreach('./') do |file|
: until(file =~ /[0-9]{8}/)
: p 'next'
: next
: end
: p file
: end
在 foreach do |file| 内,此区块只针对目前扫到的 file,所以应该是唯一的,
也就是说假如档案名称是:01238765 的话,那此区块里 file 就会被指派为 01238765,
根据您的条件式 file =~ /[0-9]{8}/,此处的 01238765 就会被认定为 true。
但是注意了,您用的是「until」,until 的意思是:
while !
也就是说上面的 true 会被指为 false。
但这不是重点,重点是 while 是回圈,若条件没有中途改变,是不会离开的。
有看到您想使用 next 来强制跳离,但是 next 只会对最近的回圈有影响;
也就是说只会对这个「until」有用,所以执行完 next,
我们的 file 变数还是没有改变,既然没有改变,当然不会跳开回圈。
: # 这个正常执行
: Dir.foreach('./') do |file|
: if(file !~ /[0-9]{8}/)
: p 'next'
: next
: end
: p file
: end
当然不一样,if 是条件式,跟回圈是两件事,它就像卫生纸一样,用了就丢。
既然不是回圈,所以 next 不会针对 if 操作,最近的回圈在 foreach do |file| end,
所以 next 後,後面的 p file 也不会动作,直接跳到下一个档案,除非没有进入 if。
if == unless !
while == until !
这样的说明希望您会了解。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.126.162.140
1F:→ ireullin:谢谢您的指点,我刚刚才发现我打错了,真是不好意思 09/11 16:39