2014-02-25 33 views
1

我是Ruby新手,不知道如何访问函数内的数据成员(语法)。这是我的问题。我有一个函数可以将数值放入用户给定范围内的数字数组中,这些数字都是素数。函数看起来像这样:如何使用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关键字调用另一个函数从数组“A”获取数据。例如,我需要打印连续的素数,这些素数存储在'a'中,并且我有这样的代码来执行此操作(除非我不知道如何从下面的代码中获取'a'的值。这就是所谓的倒闭,我相信)

find_primes(0,50) do 

    i = 0 

    while i < a.size - 1 
     print "[#{a[i]} #{a[i+1]} " 
    end 
end 

这是非常新的给我,我无法找到如何做我负责做的很好来源。预先感谢您

+1

很好看 - ['Prime'(http://www.ruby-doc.org/stdlib-1.9.3/libdoc/prime/rdoc/Prime.html)也。 –

回答

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}"} 
+0

我相信你有错误的想法,我需要隐式地将一段代码传入函数'find_primes'来操纵数据。即使这样效率低下,我也会被告知要这样做 – Zac

+0

“隐含地通过一段代码”是什么意思? – sawa

+0

我收回了我以前的评论,我想你确实回答了这个问题,但我没有认出来。 Ruby语法问题。 – Zac

0

如果你想变一回,你应该使用的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像普通方法那样返回数组。您不必使用带块的产量。那就是:

def find_primes(from, to) 
    (from..to).select { |n| Prime.prime? n } 
end 

primes = find_primes(0,10) 
# Do something with primes