在Ruby中匹配结束标记

时间:2012-02-07 20:25:42

标签: ruby

要学习Ruby,我正在实现从节点和简单堆栈开始的不同数据结构。如果我将每个def与相应的结尾相匹配,那么期待$ end(EOF)但获得end会有很多错误。所以我可以通过在课程结束时堆叠一些end来修复它,但显然我不知道为什么会这样。

require "Node"
class Stack
    attr_accessor :top

    def size
            @size
    end

    def push(node)
        if node && node.next
            node.next = top
            top = node
        end
        size++
    def pop()
        if top != nil
            top = top.next
        end
        size--


    def to_s
        if top != nil
            temp = top
            while temp != nil
                puts temp.value
                temp = temp.next
            end
        else
            puts "The stack is empty"
        end
    end
end
end
end

节点类非常简单,不应该导致任何问题:

class Node
    attr_accessor :next
    def initialize(value)
        @value = value
    end
end

在Frankenstein堆栈上一切正常,除了推送节点导致NoMethodError: undefined method +@' for nil:NilClass。不确定这是否相关,但我主要关注方法/类声明的语法并使用end

2 个答案:

答案 0 :(得分:1)

您收到错误,因为ruby没有++--运营商。

Ruby理解以下构造

size++
def pop()
# and
size--
def to_s()

size + +def pop()
# and 
size - -def to_s()

Ruby语法是面向表达式的,方法定义是Ruby中的表达式。方法定义表达式(def pop()def to_s())将评估为nil(在您的代码中,您实际定义了pop方法体内的方法push和{{1} } to_s方法体内部。这就是为什么你得到pop错误 - 它评估表达式NoMethodError: undefined method +@' for nil:NilClass而nil没有定义一元加运算符。在此表达式中,第一个size + +nil+加法运算符(Fixnumsize),第二个Fixnum是一元加+的运算符( nil表达式的结果。

使用def pop()+= 1代替-= 1++。您的代码应如下所示:

--

答案 1 :(得分:0)

您的def没有匹配的end。此外,Ruby没有++运算符;你必须改为使用+= 1