从数组中删除项而不返回它

时间:2016-06-11 01:02:32

标签: arrays ruby rspec

我正在尝试编写一个方法,使得像这样的rspec测试通过:

it "starts the thing and move on" do
  class.method_1("Name One")
  class.method_1("Name Two")
  expect(class.method_2).to eq "Some string Name One"
  expect(class.method_3).to eq ["Name Two"]
end

method_1只是为数组添加一个名称,method_3返回数组(在initialize方法中定义):

def method_1(name)
  @array << name
end

def method_3
  @array
end

我认为将@array[0]插入字符串并使用@array.delete_at(0)修改数组非常简单。像这样:

def method_2
  p "Some string #{@array[0]}"
  @array.delete_at(0)
end

但该方法返回"Name One"而不是字符串。如果我注释掉删除代码,字符串将正确返回,但我的数组尚未被修改。我已经在Ruby文档中工作了很长时间,但是#shift在返回删除的项目方面存在同样的问题。

我几乎可以肯定我已经过于复杂了 - 我错过了什么?

2 个答案:

答案 0 :(得分:1)

你可以把这一切都折叠成更传统的Ruby,就像这样:

class MyTestClass
  attr_reader :array

  def initialize
    @array = [ ]
  end

  def push(s)
    @array << s
  end

  def special_shift
    "Some string #{@array.shift}"
  end
end

然后就用法而言:

it "starts the thing and move on" do
  my_thing.push("Name One")
  my_thing.push("Name Two")
  expect(my_thing.special_shift).to eq "Some string Name One"
  expect(my_thing.array).to eq ["Name Two"]
end

使用与Ruby约定一致的pushshift等名称可以使方法的目的和操作更容易理解。

当涉及到method_3的实现时,您忘记了可以在#{...}块中内联任何内容,甚至是修改内容的方法。 p方法用于显示,它不会返回任何内容。要返回一些东西,你需要将它作为评估的最后一件事(隐式)或者使用return(显式)。

答案 1 :(得分:0)

method_2更改为以下内容以恢复数组

def method_2
  p "Some string #{@array[0]}"
  @array.delete_at(0)
  @array
end

来自ruby-doc.org上的array#delete_if

  

删除指定索引处的元素,返回该元素,如果索引超出范围,则删除nil。

或者使用返回自我的object#tap

@array = [1,2,3,4]
#=> [1, 2, 3, 4]
@array.tap {|arr| arr.delete_at(0)}
#=> [2, 3, 4]