0

TDD:

describe RPNCalculator do

  attr_accessor :calculator

  before do
    @calculator = RPNCalculator.new
  end

it "adds two numbers" do
  calculator.push(2)
  calculator.push(3)
  calculator.plus
  calculator.value.should == 5
end
end

私のコード:

class RPNCalculator
attr_accessor :calculator

def initialize()
  @calculator = []
end

def RPNCalculator(x=0,y=0)
@calculator.push(x)
@calculator.push(y)
@calculator.map {|x,y| x + y }
end

エラー:

RPNCalculator
adds two numbers (FAILED - 1)

失敗:

1)RPNCalculator adds two numbers
Failure/Error: calculator.push(2)
NoMethodError:
undefined method `push' for #<RPNCalculator:0x000000021b85a8 @calculator=[]>
4

2 に答える 2

1

問題は、あなたが呼び出すテストにありますcalculator.push(2)RPNCalculatorというメソッドを持たないオブジェクトでそれを呼び出していますpush。むしろ、そのメソッドを持つ@calculatorにインスタンス化した、クラス内のインスタンス変数Arrayです。

テストは実際には次のようになります。

it "adds two numbers" do
  @calculator.RPNCalculator(2,3).value.should == 5
end

大文字で始まるメソッド名を持つことは悪い形式と見なされることを指摘しておく必要があります。

あなたのテストが何を得ようとしているのかを推測するほど大胆かもしれませんが、あなたは自分のテストにpush数値を入力し、数値RPNCalculatorをプッシュし続け、それらの数値の合計を自由に取得したいと考えています。これが実際に当てはまる場合は、次のようなものを探している可能性があります。

class RPNCalculator
attr_accessor :calculator

def initialize()
  @calculator = []
end

def push(*num)
  # Use is_a? in order to ensure anything added to
  # the Array can later be added together 
  @calculator.push(*num) if num.all? {|n| n.is_a? Numeric}
  # If you would like this to work with any class that can be added
  # then change 'n.is_a? Numeric' to 'n.respond_to? :+'
end

def plus
  @calculator.reduce(:+)
end

def value
  plus
end

そうすることで、元のテストを変更せずに機能させることができます。

使用例:

calc = RPNCalculator.new
calc.push(3)
calc.push(2)
calc.plus #=> 5
calc.push(6)
calc.plus #=> 8   
calc.push(1,2,3,4)
calc.plus #=> 18

メソッド定義でスプラット演算子 (アスタリスク) を使用していることに注意してください。このトピックについていくつか読むことをお勧めします。学び、愛する価値があります。

于 2013-04-02T18:19:05.677 に答える
0

これを試して:

class RPNCalculator
attr_accessor :calculator

def initialize()
  @calculator = []
end

def RPNCalculator(x=0,y=0)
  @calculator.push(x)
  @calculator.push(y)
  p @calculator.reduce(&:+)
end
end

cal = RPNCalculator.new
cal.RPNCalculator(10,20) #30
于 2013-04-02T18:14:21.357 に答える