【问题标题】:Creating a Ruby method that pads an Array创建一个填充数组的 Ruby 方法
【发布时间】: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 &lt;&lt; value}if desired_size&gt;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 &gt; self.length 是否在这种情况下填充东西。否则我们不需要做任何事情,除了返回self,就像我们在另一种情况下所做的那样。由于它们共享 return self,因此您不应将其放在单独的 if/else 块中。

标签: ruby arrays methods


【解决方案1】:

在您的所有 3 次尝试中,如果 desired_size 大于原始数组大小,您将返回原始数组。你有那个倒退。换句话说,你只是返回而不是填充。

您的第一次尝试很接近。你需要: 1)修复你的条件检查。 2)修改self数组就可以了,不需要再复杂的尝试。 3) 确保无论做什么都要回归自我。

通过修改self,不仅返回修改后的数组,还改变了变量test_array持有的数组。所以如果你这样做:

test_array = [1, 2, 3]
puts test_array.pad(5, 4).inspect  // prints [1, 2, 3, 4, 4]
puts test_array                    // prints [1, 2, 3, 4, 4]

在Ruby中,当一个函数修改self时,函数名以!结尾,所以如果你写它修改self,最好命名为pad!

如果你想写成不修改自身,你可以从:

array = self.dup

然后在 array 上执行所有操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2011-07-13
    • 2022-12-18
    • 2017-09-18
    相关资源
    最近更新 更多