Создание рубиновой функции для фильтрации простых чисел - PullRequest
0 голосов
/ 15 марта 2019

В приведенном ниже примере, что означает (2..n - 1).all? точно?

def prime?(n)
  if n >=2
    (2..n - 1).all? do |x|
      n % x != 0
    end
  else
    false
  end
end

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

Ответы [ 2 ]

1 голос
/ 15 марта 2019

если n = 10

, затем для каждого значения x от 2 до 9 (которое равно n-1)

n% x не должно равняться нулю

более

(2..n-1) - это диапазон

all? - это метод, определенный в Enumberable , который доступен для диапазонов

0 голосов
/ 15 марта 2019

Возможно, вам нужно посмотреть, как работают блоки в Ruby. Это то, что бросило меня, когда я начал. На самом деле вы передаете код (блок) в итератор, который будет задействован с помощью вызова yield () в коде итератора. Блоки могут принимать 2 основные формы:

(2..n - 1).all? do |x|
  n % x != 0
end

эквивалентно

(2..n - 1).all? { |x| n % x != 0 }

, который на первый взгляд может быть легче переварить. В этом случае блок:

{ |x| n % x != 0 }

Мы можем сделать диапазон явным, добавив скобки:

(2..(n - 1)).all? { |x| n % x != 0 }

Возможность отправки кода через блок делает его удобным при написании итераторов. Диапазон # все? такой итератор (я считаю). И вы можете отправить любой код, который вам нравится, в качестве теста, который вы хотите, чтобы все прошло (так как мы говорим обо всем?

| х | это то, как параметр передается в блок из кода итератора через вызов yield (). В этом случае предположим, что текущее значение диапазона представлено i. Затем отправленный блок будет вызван вызовом yield (i) в итераторе. Если вы изучите код, вы должны увидеть его. Таким образом, вы можете поместить любой код в блок:

(2..(n - 1)).all? { |x| (n + x) < 100 }

, который должен возвращать true, если n не становится слишком большим.

Я на этом остановлюсь.

...