2015-02-26 2 views
2

Я звоню to_s в методе:`to_s` не преобразования целого числа в строку

$ def my_function(num) 
$ number = num.to_s.split(//) 
$ puts number 
$ end 

$ my_function(233) 
2 
3 
3 
# => nil 

Он смотрит на меня, как внутри функции, не массив не создается, так как выход nil. Почему массив строк не создается, когда to_s.split(//) вызывается внутри метода?

Кроме того, почему вывод для puts number, по-видимому, только каждая цифра на отдельной строке? Нужно ли явно создавать массив внутри функции, а затем явно вставлять в нее разделенное число?

ответ

3

При вызове puts на массив, он выводит каждый элемент массива отдельно с новой строки после каждого элемента. Чтобы подтвердить, что ваши методы to_s преобразуют число в строку, попробуйте использовать print вместо puts.

Что касается вывода nil, то это возвращаемое значение вашей функции. Если нет явного return, возвращаемое значение функции будет оценкой последней строки, которая в вашем случае: puts number. Возвращаемое значение puts number - nil; печать значения number является побочным эффектом, а не возвращаемым значением.

Мне любопытно, почему выход действительно был массив в ваших первых строк кода (не в функции):

$ num = 233 
$ number = num.to_s.split(//) 
$ puts number 
=> ['2', '3', '3'] 

Я подозреваю, что вы на самом деле видели, что выход после num.to_s.split(//) линии, а не линии puts number.

4

Ваша функция: puts number. Это отобразит его, а не вернет. puts возвращает нуль, поэтому ваш звонок my_function(233) возвращает ноль. Причина, по которой вывод - это один номер в каждой строке, - это то, что puts делает, когда массив передается ему. Один элемент на строку.

Попробуйте этот код:

puts [1,2,3] 

puts '=' * 40 

def my_function(num) 
    num.to_s.split(//) 
end 

x = my_function(233) 

p x 

При запуске выход есть:

1 
2 
3 
======================================== 
["2", "3", "3"] 

Ключевым отличием является то, что my_function больше не отображает никаких выходных данных. Он просто возвращает результат. Важно помнить, что метод ruby ​​вернет последний обработанный оператор, как результат. То есть вышеуказанный метод такой же:

def my_function(num) 
    return num.to_s.split(//) 
end 
+0

спасибо. Это было очень полезно. Я полагался на неявные возвращения, не понимая, что я переопределял их puts. Это решило. –

3

Массив, который вы видите в своем первом фрагменте, является результатом оценки функции разделения. Попробуйте это вне функции: puts [1,2,3], и вы увидите, что результаты не изменились.

Используйте print, если вы хотите, чтобы он напечатал его мило.

С наилучшими пожеланиями

Смежные вопросы