2015-04-12 8 views
0

我试图将#Array和#Enumerable类混入到我的自定义类中,以便可以使用push,pop,size和inject方法(也许可能其他一些)。我试图用include Array以及class RPNCalculator < Array我认为是正确的语法,但得到的错误:在#Array和#Enumerable类中混合到我的自定义类的问题

home/action/12_rpn_calculator.rb:2:in `include': wrong argument type Class (expected Module) (TypeError) 

所以我尝试使用module Array,它似乎在运行,但不敛方法。所以我很困惑。这里是我的代码:

class RPNCalculator 
    include Array 

    attr_accessor :calculator, :result 


    def initialize 
    @calculator = [] 
    @result = 0 
    end 

    #def push(*num) 
    #@calculator.push(*num) 
    #end 

    def has_enough #check if there are enough args 
    if @calculator.count < 2 
     raise "calculator is empty" 
     false 
    else 
     true 
    end 
    end 

    def result 
    end 

    def get_nums(source) #get as many numbers as needed from array for method 
    calculate = [] 
    source.map{|n| calculate << n.pop} 
    calculate 
    end 

    def plus 
    if has_enough then get_nums(@calculator).inject(:+) end 
    end 

    def minus 
    end 

    def divide 
    end 

    def times 
    end 

    end 

为什么我没有能够得到它使用include Arrayclass Myclass < Array运行?

这里是RSpec的情况下,它可以帮助:

require_relative "12_rpn_calculator" 


    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 

    it "adds three numbers" do 
    calculator.push(2) 
    calculator.push(3) 
    calculator.push(4) 
    calculator.plus 
    calculator.value.should == 7 
    calculator.plus 
    calculator.value.should == 9 
    end 

    it "subtracts the second number from the first number" do 
    calculator.push(2) 
    calculator.push(3) 
    calculator.minus 
    calculator.value.should == -1 
    end 

    it "adds and subtracts" do 
    calculator.push(2) 
    calculator.push(3) 
    calculator.push(4) 
    calculator.minus 
    calculator.value.should == -1 
    calculator.plus 
    calculator.value.should == 1 
    end 

    it "multiplies and divides" do 
    calculator.push(2) 
    calculator.push(3) 
    calculator.push(4) 
    calculator.divide 
    calculator.value.should == (3.0/4.0) 
    calculator.times 
    calculator.value.should == 2.0 * (3.0/4.0) 
    end 

    it "resolves operator precedence unambiguously" do 
    # 1 2 + 3 * => (1 + 2) * 3 
    calculator.push(1) 
    calculator.push(2) 
    calculator.plus 
    calculator.push(3) 
    calculator.times 
    calculator.value.should == (1+2)*3 

    @calculator = RPNCalculator.new 
    # 1 2 3 * + => 1 + (2 * 3) 
    calculator.push(1) 
    calculator.push(2) 
    calculator.push(3) 
    calculator.times 
    calculator.plus 
    calculator.value.should == 1+(2*3) 
    end 

    it "fails informatively when there's not enough values stacked away" do 
    expect { 
     calculator.plus 
    }.to raise_error("calculator is empty") 

    expect { 
     calculator.minus 
    }.to raise_error("calculator is empty") 

    expect { 
     calculator.times 
    }.to raise_error("calculator is empty") 

    expect { 
     calculator.divide 
    }.to raise_error("calculator is empty") 
    end 

    # extra credit 
    it "tokenizes a string" do 
    calculator.tokens("1 2 3 * + 4 5 - /").should == 
     [1, 2, 3, :*, :+, 4, 5, :-, :/] 
    end 

    # extra credit 
    it "evaluates a string" do 
    calculator.evaluate("1 2 3 * +").should == 
     ((2 * 3) + 1) 

    calculator.evaluate("4 5 -").should == 
     (4 - 5) 

    calculator.evaluate("2 3 /").should == 
     (2.0/3.0) 

    calculator.evaluate("1 2 3 * + 4 5 - /").should == 
     (1.0 + (2 * 3))/(4 - 5) 
    end 

end 
+0

子类数组应该是可能的,但在我看来,有一个数组实例变量来表示栈是更好的设计选择 –

+0

是我最终只是这样做。事实证明这很容易,大声笑 – HolyMoly

回答

0

只需编写自定义的流行/推的方法,因为如果处理的数据类型是一个数组类型,然后弹出,并推动将可用。

Ruby: extract features of a Stack from the Array class

+0

当我在使用模块之前尝试使用'include Array'和'RPNCalculator HolyMoly

+2

数组是一个类,而不是一个模块。 – wurde

+0

我同意。但正如我所说(我只是试了一遍)我得到这个错误:'/home/action/12_rpn_calculator.rb:2:in'include':错误的参数类型类(预期的模块)(TypeError)' – HolyMoly

相关问题