(Другой) уровень стека слишком глубоко в Ruby
Я вызываю метод внутри себя (рекурсивный цикл) и буду благодарен за некоторые слова, методы или исправленный код, чтобы это исправить.
Код:
class Person_verifier
def initialize(first_name, ssn)
@first_name = first_name
@ssn = ssn.to_s
end
def first_name
@first_name
end
def ssn
if ssn[9] =~ /[1, 3, 5, 7, 9]/
"#{first_name}'s social security number is #{ssn} and based on the second-last number, #{first_name} is a Male"
elsif ssn[9] =~ /[0, 2, 4, 6, 8]/
"#{first_name}'s social security number is #{ssn} and based on the second-last number, #{first_name} is a Female"
else
return false
end
end
end
IRB выход:
load './ssn.rb'
d = Person_verifier.new("MyName", "010285-123X")
d.first_name
# => "MyName"
d.ssn
# => SystemStackError: stack level too deep
from /home/username/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/irb/workspace.rb:86
Maybe IRB bug!
1 ответ
Решение
def ssn
if @ssn[9] =~ /[1, 3, 5, 7, 9]/
"#{first_name}'s social security number is #{@ssn} and based on the second-last number, #{first_name} is a Male"
elsif @ssn[9] =~ /[0, 2, 4, 6, 8]/
"#{first_name}'s social security number is #{@ssn} and based on the second-last number, #{first_name} is a Female"
else
return false
end
end
Код выше должен работать. Вы просто нуждались в @
символ для ssn
внутри вашего метода. В противном случае становится ясно, что рекурсивный вызов происходит, когда вы пытаетесь ssn
, Обратите внимание, что переменные экземпляра видны только с @
, Это не подразумевается. Ясно, что вы столкнетесь с проблемами, похожими на те, с которыми вы столкнулись.