В Ruby, как я могу собрать каждый новый элемент, проходящий через метод в массив? - PullRequest
0 голосов
/ 28 января 2012

Я создаю небольшую программу с простыми числами, и меня смущает одна вещь.

У меня есть функция с именем create_numbers, которая генерирует числа и передает их новой функции с именем check_for_primes, которая передает только простые числа в конечную функцию с именем count_primes. Я хочу собрать каждое простое число в массив в функции count_primes, но по какой-то причине каждое число собирается как отдельный массив.

Есть идеи, что я делаю не так?

Вот код:

def create_numbers
  nums = 1
  while nums < 100
    nums = nums + 2
    check_for_primes(nums)
  end  
end

def count_primes(nums)  
  array = []
  array << nums  
  puts array.inspect
end

def check_for_primes(nums)
    (2...nums).each do |i|
      if nums%i == 0
        nums = false
        break
      end
    end
    if nums != false
      count_primes(nums)
    end
end

create_numbers

Ответы [ 2 ]

1 голос
/ 28 января 2012

Попробуйте это:

START = 1
STEP = 2

class Integer
  def prime?
    return if self < 2
    (2...self).each do |i|
      return if self % i == 0
    end
    true
  end
end

def create_numbers
  num = START
  while (num + STEP) < 100
    num += STEP
    primes << num if num.prime?
  end
end

def primes
  @primes ||= []
end

create_numbers
p primes

Если вы хотите сохранить «состояние» чего-либо, поместите его в переменную экземпляра (@var).Он будет доступен за пределами области действия текущей функции.

Кроме того, попробуйте присвоить другим переменным имена.Например, вместо «nums» в методе create_numbers используйте «num».Поскольку переменная ссылается только на одно число за раз, а не на список чисел, присвоение ей имени во множественном числе может смутить людей (включая меня) ...

Надеюсь, это поможет,

-Люк

1 голос
/ 28 января 2012

каждый раз в count_primes вы помещаете значение в массив (который должен иметь лучшее имя, кстати). К сожалению, каждый раз это новая переменная, называемая массивом, и поскольку никто за пределами функции не может видеть эту переменную, она теряется, когда функция завершается. Если вы хотите сохранить значения, которые вы уже нашли, вам нужно установить некоторое состояние вне вашей функции.

Я могу придумать 2 быстрых решения. Можно было бы объявить свое хранилище в начале create_numbers и передать его в обе функции.

def count_primes(num, arr)

def check_for_primes(nums, arr)

Другой вариант - установить переменную вне всех функций, $ array, например, для хранения значений.

$array = []
...
$array << num

Поскольку область действия $ array глобальна (то есть все функции имеют к ней доступ), у вас есть доступ к ней из любой точки файла, и вы можете просто добавлять к ней что-либо в виде простых чисел. Обратите внимание, что использование глобалов таким способом обычно считается плохим стилем, и более элегантное решение будет передавать параметры и использовать возвращаемые значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...