【发布时间】:2014-08-18 20:52:55
【问题描述】:
我正在创建一个填充数组的方法,并接受 1. 所需值和 2. 可选字符串/整数值。 Desired_size 反映了数组中所需的元素数量。如果将字符串/整数作为第二个值传入,则该值用于用额外元素填充数组。我知道有一种“填充”方法可以简化此操作 - 但这会在我正在做的作业中作弊。
问题:无论我做什么,都只返回原始数组。我从这里开始:
class Array
def pad(desired_size, value = nil)
desired_size >= self.length ? return self : (desired_size - self.length).times.do { |x| self << value }
end
end
test_array = [1, 2, 3]
test_array.pad(5)
根据我的研究,这个问题似乎与试图改变 self 的数组有关,所以我了解了 .inject 并试了一下:
class Array
def pad(desired_size, value = nil)
if desired_size >= self.length
return self
else
(desired_size - self.length).times.inject { |array, x| array << value }
return array
end
end
end
test_array = [1, 2, 3]
test_array.pad(5)
互联网告诉我问题可能出在对 self 的任何引用上,所以我完全消除了它:
class Array
def pad(desired_size, value = nil)
array = []
self.each { |x| array << x }
if desired_size >= array.length
return array
else
(desired_size - array.length).times.inject { |array, x| array << value }
return array
end
end
end
test_array = [1, 2, 3]
test_array.pad(5)
我对课程非常陌生,并且仍在努力学习它们。也许我什至没有用我的 test_array 以正确的方式测试它们?否则,我认为问题在于我获得了识别传入的 required_size 值的方法。我不知道下一步该去哪里。任何意见,将不胜感激。
提前感谢您的宝贵时间。
【问题讨论】:
-
您第一次尝试
pad方法实际上并没有正常运行,出现错误。如果你把它作为你的 pad 方法,它会起作用(我把它挤在一起,所以通过添加空格和删除分号使其更具可读性)。(desired_size - self.length).times{self << value}if desired_size>self.length;return self。由于这只是一个小错误修正,我发表评论。 -
您考虑过使用.map 还是.map! ?我认为后者应该在 self 中修改... ruby 类 String 有一个替换自身的方法,称为 replace()。不确定类 Array 是否也有类似的东西,恐怕它可能没有。但听起来 .map 在这里肯定很有用!
-
提示:如果
desired_size大于或小于当前大小,是否要填充? -
@DaniëlKnippers 您的代码运行良好,但我不确定如何修复我的原始代码以使其与您的代码一样好。我试图将其转换为 if/else 但没有 dice... Jörg:如果 desired_size 大于原始数组的长度,我将进行填充。我认为我的代码有点正确-但我很新,可能缺少一些明显的东西。非常感谢你们到目前为止的帮助!
-
@CJJohnson 其中一件事是;不需要
else。想想看。 1. 您总是想要返回 Array 实例self。 2. 如果desired_size大于self.length,您仅 想做某事。这就是我改变的;检查desired_size > self.length是否在这种情况下填充东西。否则我们不需要做任何事情,除了返回self,就像我们在另一种情况下所做的那样。由于它们共享return self,因此您不应将其放在单独的if/else块中。