Преобразование в _i не работает (Ruby) - PullRequest
0 голосов
/ 14 мая 2018

Я довольно новичок в программировании, и я делаю основы на codewars.com, и у меня возникли некоторые проблемы с этим. Цель состоит в том, чтобы взять группу целых чисел, обратить их и поместить их в массив. Вот мой код (Я сделал функцию tf, чтобы увидеть, что происходит в коде.)

def digitize(n)
  answer = n.to_s.split(//).reverse!
  def tf(it)
    str_test = it.is_a? String
    int_test = it.is_a? Integer
    puts "String: #{str_test}"
    puts "Integer: #{int_test}"
  end
  Array(answer)
  unless answer.is_a? Integer
    for item in answer
      item.to_i
      puts item
      tf(item)
    end
  end
  return answer
end

Образец теста:

Test.assert_equals(digitize(35231),[1,3,2,5,3])

При тестировании возвращает:

1
String: true
Integer: false
3
String: true
Integer: false
2
String: true
Integer: false
5
String: true
Integer: false
3
String: true
Integer: false

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

1 Ответ

0 голосов
/ 14 мая 2018

Назначение

item = item.to_i

Исправит вывод в tf, но ваш возвращенный ответ все равно будет содержать все строки.Если вы хотите сделать это один за другим, как вы делаете, вам нужно будет присвоить его обратно в индекс массива:

answer.each_with_index do |item, index|
  answer[index] = item.to_i
end

Хотя, еще лучший способ сделать это будет с map (возвращает новый массив) или map! (на месте):

# return this line (make it the last line in the method) or make sure
# to re-assign answer
answer.map(&:to_i)
# or do this one to use `answer` later on with all integers.
answer.map!(&:to_i)

(см. этот вопрос очто синтаксис &:to_i).

Следует также отметить (возможно), что рубиисты вообще не любят циклы for и предпочитают циклы each.

Кроме того,строка:

Array(answer)

не изменяет answer на месте и возвращает его приведение к массиву, поэтому строка ничего не делает:

a = "1"
Array(a) # => ["1"]
a # => "1"
a = Array(a) # => ["1"]
a # => ["1"]

Вы также, дондаже не нужно это делать, поскольку answer уже является массивом, из которого вы split его (вы могли бы также использовать chars вместо split(//)).Таким образом, строка unless answer.is_a?(Integer) никогда не будет истинной.

Последнее, что я вижу, это то, что в более новых версиях ruby ​​есть встроенный метод для всего этого, digits:

 35231.digits # => [1, 3, 2, 5, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...