Как пройти цикл с помощью pry и просмотреть значение итератора?

Я вставил binding.pry в свою программу Ruby и пытаюсь просмотреть значение итератора на каждой итерации моего цикла:

require 'pry'

def longest_palindrome s
  max_palindrome_len = 0
  for i in (0..s.length)
    binding.pry
    for j in (i..s.length)
      binding.pry
      substr = s[i..j]
      if substr == substr.reverse && substr.length > max_palindrome_len
        max_palindrome_len = substr.length
      end
    end
  end
  return max_palindrome_len
end

longest_palindrome "racer"

Я хочу просмотреть значения для i и j на каждой итерации в цикле.

Я уверен, что я просто что-то упускаю здесь, но я не смог понять, что делать из документации.


person j doe    schedule 10.02.2016    source источник
comment
Что пробовали вы? Каков результат попытки?   -  person the Tin Man    schedule 10.02.2016
comment
Обычный способ — просто добавить операторы puts. Например, вставьте строку puts "i = #{i}" после for i in (0..s.length) и "puts " j = #{j}" после for j in (i..s.length). (Обратите внимание, что я сделал отступ от последнего puts на пару пробелов, чтобы его было легче читать.)...   -  person Cary Swoveland    schedule 11.02.2016
comment
... Object#tap может быть также удобно. Например, предположим, что у вас есть arr.group_by.with_index {...} и вы хотите проверить элементы перечислителя arr.group_by. Вы можете сделать это следующим образом: arr.group_by.tap { |enum| puts "arr.group_by.to_a = #{enum.to_a}" }.with index {...}. Это работает, потому что tap возвращает свой получатель, а я не изменил получателя в блоке tap.   -  person Cary Swoveland    schedule 11.02.2016


Ответы (1)


Вы можете ввести p i и p j, чтобы проверить их вручную.

Однако это свело бы меня с ума, поэтому я бы временно вставил puts i и puts j.

Не используйте циклы for с Ruby. Вместо этого мы используем each или upto, downto или times, в зависимости от нашей цели. Кроме того, явные операторы return не нужны в конце метода, если только вы не принудительно завершаете код досрочно.

Я бы написал ваш код примерно так:

require 'pry'

def longest_palindrome(s)
  max_palindrome_len = 0

  s.length.times do |i|
    binding.pry
    i.upto(s.length) do |j|
      binding.pry
      substr = s[i..j]
      if substr == substr.reverse && substr.length > max_palindrome_len
        max_palindrome_len = substr.length
      end
    end
  end

  max_palindrome_len
end

longest_palindrome "racer"
person the Tin Man    schedule 10.02.2016