如何使用Ruby方法调用访问变量?

时间:2014-02-25 18:13:54

标签: ruby closures

我是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

这对我来说都是一个新鲜事物,我找不到如何完成我的任务。提前谢谢

2 个答案:

答案 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