我正在编写一种能够尽早返回值的方法。我知道如何以不同的方式编写,但我想理解为什么以这种方式编写它会导致返回错误的值。我试图获得" nth"素数,以下方法似乎有效,并且没有错误,但它一直返回1.在下面,我甚至使用了" p"函数确保每次都找到count和int递增,但无论出于何种原因,我得到的返回值是1,或者我称之为upto方法的任何值。关于为什么会这种情况发生的任何指示或解释都将非常受欢迎。
def primeMover(num)
count = 0
1.upto(num) do |int|
return int if count == num
count += 1 if is_prime?(int)
end
end
def is_prime?(number)
return false if number < 2
2.upto(Math.sqrt(number)) { |divisor| return false if number % divisor == 0 }
return true
end
答案 0 :(得分:1)
它一直返回1.
upto()定义为返回左侧。
通常,方法返回最后执行的语句的值 - 不需要return语句。
primeMover()中的最后一个语句是方法调用1.upto()
。请注意,块类似于方法定义,并且块实际上作为参数发送到upto()方法,如下所示:
1.upto(3, proc{|int| ...})
因此,如果upto()运行完成,则primeMover()的返回值将是upto()返回的任何值。
即使isprime?()
每次都返回true,return int
也永远不会执行:
def primeMover(num)
count = 0
1.upto(num) do |int|
return int if count == num
count += 1 #mimicking is_prime()? returning true every time
end
end
result = primeMover(3)
puts result
--output:--
1
那是因为你增加计数太晚了:
def primeMover(num)
count = 0
puts "num = #{num}"
1.upto(num) do |int|
puts int
return int if count == num
puts "int = #{int}, count = #{count}"
count += 1
puts count
puts '-' * 10
end
end
result = primeMover(3)
puts '=' * 10
puts result
--output:--
num = 3
1
int = 1, count = 0
1
----------
2
int = 2, count = 1
2
----------
3
int = 3, count = 2
3
----------
==========
1