Возможно, вам нужно посмотреть, как работают блоки в 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 не становится слишком большим.
Я на этом остановлюсь.