转换为to_i不起作用(Ruby)

时间:2018-05-14 17:58:47

标签: ruby

我对编程非常陌生,而且我在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 :(得分:1)

勘定

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)

(请参阅this question了解&:to_i语法)。

还应该注意(可能),Rubyists通常不喜欢for循环并且更喜欢each循环。

另外,该行:

Array(answer)

不会修改answer,并将其转换为数组,因此该行无效:

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

你也是,甚至不需要这样做,因为answer已经是你split所在的数组(你也可以使用chars代替{{1} }})。因此,split(//)行永远不会成真。

最后一个重要的事情,我看到在更新版本的ruby中,有一个内置的方法来完成所有这些,digits

unless answer.is_a?(Integer)