我的代码给了我想要的结果,但它没有通过rspec。这是我的代码:
def tokens(tokens)
tokenized = []
syms = %w(* / - +)
tokenized << tokens.split.map{|i| syms.include?(i) ? i.to_sym : i.to_i}
tokenized
end
这里是respec:
# extra credit
it "tokenizes a string" do
calculator.tokens("1 2 3 * + 4 5 - /").should ==
[1, 2, 3, :*, :+, 4, 5, :-, :/]
end
现在,我的代码确实如此,因为它在一个数组中,返回
[1, 2, 3, :*, :+, 4, 5, :-, :/]
但是当我运行respec时它不会通过,因为它上面有一组额外的括号,如下所示: 失败:
1) RPNCalculator tokenizes a string
Failure/Error: [1, 2, 3, :*, :+, 4, 5, :-, :/]
expected: [1, 2, 3, :*, :+, 4, 5, :-, :/]
got: [[1, 2, 3, :*, :+, 4, 5, :-, :/]] (using ==)
我认为rspec正在使用类似.inspect的方法来添加括号(我不确切知道.should是如何工作的)。对于所有观点和目的,我的代码似乎是正确的但它不会按原样通过。我该怎么做才能通过?
答案 0 :(得分:1)
map
返回一个数组。所以当你这样做时
tokenized << tokens.split.map{|i| syms.include?(i) ? i.to_sym : i.to_i}
您要将数组附加到tokenized
数组。所以你的rspec应该是
it "tokenizes a string" do
calculator.tokens("1 2 3 * + 4 5 - /").should ==
[[1, 2, 3, :*, :+, 4, 5, :-, :/]]
end
答案 1 :(得分:0)
要传递您的规范,您必须更改tokens
这样的方法。
def tokens(tokens)
syms = %w(* / - +)
tokens.split.map{|i| syms.include?(i) ? i.to_sym : i.to_i}
end