Ruby 将#数组和#可枚举类混合到我的自定义类时出现问题

Ruby 将#数组和#可枚举类混合到我的自定义类时出现问题,ruby,class,mixins,Ruby,Class,Mixins,我正在尝试将#Array和#Enumerable类混合到我的自定义类中,以便可以使用push、pop、size和inject方法(可能还有其他方法)。我尝试使用include Array以及类RPNCalculator

我正在尝试将#Array和#Enumerable类混合到我的自定义类中,以便可以使用push、pop、size和inject方法(可能还有其他方法)。我尝试使用
include Array
以及
类RPNCalculator
,我认为这是正确的语法,但出现了错误:

home/action/12_rpn_calculator.rb:2:in `include': wrong argument type Class (expected Module) (TypeError)
因此,我尝试使用
模块数组
,它似乎正在运行,但没有抓住方法。所以我真的很困惑。这是我的密码:

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

只需编写自定义的pop/push方法,因为如果处理的数据类型是数组类型,那么pop和push将可用


在使用模块之前,我尝试了
include Array
RPNCalculator
两种方法,结果都出现了错误。我认为这样做是正确的。你认为我为什么会出错?我也会查看链接…数组是一个类而不是一个模块。我同意。但正如我所说(我只是再次尝试)我得到了这个错误:
/home/action/12_rpn_calculator.rb:2:in
include':错误的参数类型类(预期的模块)(TypeError)`我在本地编码,但我会更新我的答案,为您提供完整的.rb(使用include)和.rspec…gimmie a sece我看到您使用的是“include数组”,错误在第二行,这是包含数组类(不是模块)的地方。您需要的模块是可转发模块。参考文档子类化数组应该是可能的,尽管在我看来,使用数组实例变量来表示堆栈是更好的设计选择是的,我只是这样做了。结果更简单,哈哈
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