您需要将方法编写为
def twenty_one?(*nums)
nums.inject(&:+) == 21
end
这是一个小演示:-
require "minitest/autorun"
class Numerics
def twenty_one?(*nums)
nums.inject(&:+) == 21
end
end
class TestNumerics < MiniTest::Test
def setup
@numeric = Numerics.new
end
def teardown
@numeric = nil
end
def test_twenty_one?
assert_equal @numeric.twenty_one?(3, 4, 5, 6, 3), true
assert_equal @numeric.twenty_one?(3, 11, 10), false
end
end
让我们运行测试:-
[arup@Ruby]$ ruby test/test_numerics.rb
Run options: --seed 61602
# Running:
.
Finished in 0.001332s, 750.9402 runs/s, 1501.8804 assertions/s.
1 runs, 2 assertions, 0 failures, 0 errors, 0 skips
[arup@Ruby]$
在您的方法中,它返回的是您试图与之比较的Fixnum
instance 。这就是你得到错误的原因。如果您查看 的来源,您会发现两个对象之间的比较是同一类的实例,否则会抛出您得到的错误。21
true
assert_equal
注意:你当然也可以这样写nums.inject(&:+)
,因为 Ruby 在特别是开箱即用的方法nums.inject(:+)
的情况下允许这种自由。#reduce/#inject
更新
Carles Jove Buxeda提出了一个很好的想法来设计这个问题。这个想法是将方法放在模块内,然后包含它以测试其方法:
require "minitest/autorun"
module Numerics
def twenty_one?(*nums)
nums.inject(:+) == 21
end
end
class TestNumerics < MiniTest::Test
include Numerics
def test_twenty_one?
assert_equal twenty_one?(3, 4, 5, 6, 3), true
assert_equal twenty_one?(3, 11, 10), false
end
end
现在如果我运行它:
arup_ruby$ ruby test/test_numerics.rb
Run options: --seed 1223
# Running:
.
Finished in 0.001067s, 937.2071 runs/s, 1874.4142 assertions/s.
1 runs, 2 assertions, 0 failures, 0 errors, 0 skips
arup_ruby$
很酷的主意!