我对编程非常陌生,而且我在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
你们其中一个人可以帮我弄清楚它出了什么问题吗?
答案 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)