在调用变量上的方法时为Nil,但在调用变量时不是nil

时间:2014-06-08 18:42:19

标签: ruby

不明白为什么@nums.pop在value方法中不起作用。它似乎告诉我它不能为nil做到这一点,但如果我只是说@nums,它表明数组中确实存在某些东西。那么为什么我不能把它弹出来呢?

class RPNCalculator


    def initialize
        @value = value
        nums ||= []
        @nums = nums
    end


    def push(num)
        @nums << num
    end

    def plus
        if @nums[-2] == nil || @nums[-1] == nil
            raise "calculator is empty"
        else
            @value = @nums.pop + @nums.pop
            @nums.push(@value)
        end

    end

    def minus
        if @nums[-2] == nil || @nums[-1] == nil
            raise "calculator is empty"
        else
        @value = @nums[-2] - @nums[-1]
        @nums.pop(2)
        @nums.push(@value)
        end
    end

    def divide
        if @nums[-2] == nil || @nums[-1] == nil
            raise "calculator is empty"
        else
        @value = @nums[-2].to_f / @nums[-1].to_f
        @nums.pop(2)
        @nums.push(@value)
        end
    end

    def times
        if @nums[-2] == nil || @nums[-1] == nil
            raise "calculator is empty"
        else
        @value = @nums.pop.to_f * @nums.pop.to_f
        @nums.push(@value)
        end
    end

    def value
        @nums #Don't understand why @nums.pop won't work here
    end

    def tokens(str)
        str.split(" ").map { |char| (char.match(/\d/) ? char.to_i : char.to_sym)}
    end

    def evaluate(str)

        tokens(str).each do |x| 

            if x == ":-"
                minus

            elsif x == ":+"
                plus

            elsif x == ":/"
                divide

            elsif x ==":*"
                times

            else
                push(x) 
            end
        end
        value
    end 
end

错误与规范的以下部分有关:

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

错误说:

Failure/Error: calculator.value.should == 5
expected: 5
got: [5] <using ==>

如果使用.pop,则为

Failure/Error: @calculator = RPNCalculator.new
NoMethodError:
undefined method 'pop' for nil:NilClass

1 个答案:

答案 0 :(得分:1)

分配@value = value的初始化方法调用def value处的函数,该函数返回@nums,其初始化时尚未创建,因为之后创建了@nums nums ||= []; @nums = nums因此 nil 。这就是.pop不起作用的原因。

你已经将@nums创建为一个带有nums ||= []的数组,并且你正在使用push和pop,所以为什么在调用{{{{{{{ 1}}返回一个(数组)。您需要将其写为value.first.should == 5或value [0] .should == 5 ...否则您应该更改值以仅返回您想要的元素

value

初始化方法中的问题是 @value = value 。修复此问题,然后您可以在值中添加.pop。

修改

此外,您的评估是在使用值填充@nums之前调用方法。然后方法“提出”错误。只有一个值被推送到@nums后才能调用减号。

以下是我如何分割字符串

的流程
def value
  @nums.pop # or @nums[0], or @nums.first or @nums.last however you plan on using it
end

我意识到这并不是你要解决这个问题的方法......但我认为按照数学顺序进行分割将是正确的方法。因此,首先评估()之间的所有内容,然后只进行乘法和除法,然后进行所有加法和减法。

编辑我刚看了一下RPN计算器是什么。所以不要介意我的分裂建议,因为它不适用。