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