天空不也 发表于 2010-12-06 14:54

刚学RUBY 遇到问题请指教。谢谢。

$arr = []
$arr = 2
def add_prime(n)
   3.step(n,2){|num|$arr<<num if is_prime?num}
end
def is_prime?(number)
j = 0
   while $arr * $arr <= number
return false if number % $arr == 0
j+=1;puts "okok"
   end
return true
end
add_prime(5)
print $arr.join(","),"\n"

进到 while 里 每次都return false 后面的怎么执行啊。

2gua 发表于 2010-12-06 15:04

俺运行你的程序,咋都是输出:
okok
2,3,5
没错吧?

2gua 发表于 2010-12-06 15:05

应该是有执行后面的。

天空不也 发表于 2010-12-06 15:13

我就是不明白,满足条件后就应该return了。什么情况不returne 啊 。

天空不也 发表于 2010-12-06 15:15

程序没错,是我不大懂为什么 while 里的 return 后 还执行。

2gua 发表于 2010-12-06 15:39

本帖最后由 2gua 于 2010-12-06 15:41 编辑

回复 5# 天空不也


你可以在while后加一条输出语句:puts "number = " + number.to_s + "; $arr = " + $arr.to_s,看看结果:
while $arr * $arr <= number
           puts "number = " + number.to_s + "; $arr = " + $arr.to_s
           return false if number % $arr == 0
        j+=1; puts "okok"
end

输出:
number = 5; $arr = 2

而你要return false的条件是:number % $arr == 0,但此时number % $arr 为1,当然不会返回false了,应该是继续执行下一条的j+=1语句。不知道这么说你可以理解吗?

天空不也 发表于 2010-12-06 15:44

好的,理解了。写作C是这样是吧。
if(number % $arr == 0)
return false;

我原来以为
return false;
if(number % $arr == 0)
j=j+1;

谢谢喽。

2gua 发表于 2010-12-06 16:38

回复 7# 天空不也


    呵呵,这正是Ruby语法糖太甜的缘故了,要慢慢习惯Ruby的语法,另外,两条语句写在一行里,之间是要用分号隔开的哦,你那两条也没用分号隔开。

2gua 发表于 2010-12-06 17:31

但如果return false是单独的语句,后面的语句是肯定不会执行到。
页: [1]
查看完整版本: 刚学RUBY 遇到问题请指教。谢谢。