2015-04-24 4 views
1

Я пытаюсь написать метод под названием square_digits, который квадратизирует каждую цифру в заданном числе. Я писал:Неопределенный метод при попытке квадратизировать каждый элемент в массиве

def square_digits(num) 
    number_array = num.to_s.split("") 
    num_to_int = number_array.to_i 
    num_squared = num_to_int.each{|n| n**2} 
    return num_squared.join("") 
end 

При попытке запуска square_digits(3212), который должен вернуть 9414, я получаю следующее сообщение об ошибке:

`block in square_digits': undefined method `**' for "3":String (NoMethodError) 
from `each' 
from `square_digits' 
from ` 
' 

Я не совсем уверен, что я должен сделать, чтобы исправить ее; какие-либо предложения?

ответ

3

Хмм есть несколько проблем здесь:

С входом 123 должно ошибки на:

num_to_int = number_array.to_i 

С:

NoMethodError: undefined method 'to_i' for ["1","2","3"]:Array

Вы хотите:

num_to_int = number_array.map(&:to_i) 

Также

num_squared = num_to_int.each{|n| n**2}

не возвращает результаты each только исходного массива.

Так с первого исправить это будет просто вернуть "123"

вы хотите:

num_squared = num_to_int.map{|n| n**2} 

Таким образом, окончательный функция выглядит следующим образом:

def square_digits(num) 
    number_array = num.to_s.split("") 
    num_to_int = number_array.map(&:to_i) 
    num_squared = num_to_int.map{|n| n**2} 
    return num_squared.join("") 
end 

Хотя я запутался о чем ты пытаются достичь.

+1

Я полагаю, чтобы получить возможность отправлять один и тот же код, но вы меня укусил с 30сек;) 1+ –

+0

Дики, рассмотрим сам предупредил: я сообщу вам, если вы кого-нибудь укусите. –

+0

@ CarySwoveland извините, предупредил? Зачем? – DickieBoy

0

Вы также можете попробовать это;)

def square_digits(num) 
    num.to_s.split('').map { |n| n.to_i ** 2 }.join("") 
end 

Или

def square_digits(num) 
    num.to_s.chars.map { |n| n.to_i ** 2 }.join("") 
end