我是Ruby的新手,并且不知道如何访问函数中的数据成员(语法方面)。这是我的问题。我有一个函数,它将值放入一个数字数组,从用户给定的范围,是素数。该函数如下所示:
#Search for primes within a range
def find_primes(starting, ending)
#Make an empty array
a = []
for x in starting..ending
if is_prime(x)
a << x #Store results in array
end
end
yield
end
问题在于我必须使用yield关键字调用另一个函数来从数组中获取数据&#39; a&#39;。例如,我需要打印出连续的素数,这些素数存储在&#39; a&#39;中,我有这个代码来执行此操作(除非我不知道如何获取&的值#39; a&#39;来自下面的代码。这就是封闭,我相信)
find_primes(0,50) do
i = 0
while i < a.size - 1
print "[#{a[i]} #{a[i+1]} "
end
end
这对我来说都是一个新鲜事物,我找不到如何完成我的任务。提前谢谢
答案 0 :(得分:1)
你有一个完全错误的想法。在Ruby中使用for
是代码味道。如果你想要内置的迭代器,你可以这样做:
def find_primes(starting, ending, &pr)
(starting..ending).select{|x| is_prime(x)}.each(&pr)
end
find_primes(1, 10){|x| puts x}
但上面的代码缺乏灵活性。为了灵活性,您应该让它返回一个数组(或枚举器)。然后,您可以使用不同的迭代器:
def find_primes(starting, ending)
(starting..ending).select{|x| is_prime(x)}
end
find_primes(1, 10).each{|x| puts x}
find_primes(1, 10).each_cons(2){|x, y| puts "#{x} #{y}"}
答案 1 :(得分:0)
如果你想将变量a返回到块,你应该使用yield a
而不是yield
,那么你可以像这样使用find_primes:
require 'prime'
def find_primes(from, to)
yield (from..to).select { |n| Prime.prime? n }
end
find_primes(0, 10) do |primes|
p primes # => [2, 3, 5, 7]
end
话虽如此,如果需要,您可以像使用普通方法一样使用find_primes返回数组。您不必使用带块的yield。那就是:
def find_primes(from, to)
(from..to).select { |n| Prime.prime? n }
end
primes = find_primes(0,10)
# Do something with primes