我正在尝试编写一个方法,使得像这样的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
在返回删除的项目方面存在同样的问题。
我几乎可以肯定我已经过于复杂了 - 我错过了什么?
答案 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约定一致的push
和shift
等名称可以使方法的目的和操作更容易理解。
当涉及到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]