Соответствующие конечные теги в Ruby - PullRequest
0 голосов
/ 08 февраля 2012

Чтобы изучить 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

На этом стеке Франкенштейна все работает нормально, за исключением того, что нажатие на узел приводит к NoMethodError: undefined method +@' for nil:NilClass. Не уверен, что это связано, но меня больше всего интересует синтаксис объявления метода / класса и использование end

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Вы получаете ошибку, потому что в 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 тела метода и to_s внутри pop тела метода). И именно поэтому вы получаете ошибку NoMethodError: undefined method +@' for nil:NilClass - она ​​вычисляет выражение size + +nil, а nil не определяет унарный оператор плюс. В этом выражении первый + является оператором сложения Fixnum (size равен Fixnum), а второй + является унарным оператором плюс плюс nil (результат выражения def pop()).

Используйте += 1 и -= 1 вместо ++ и --. Ваш код должен выглядеть так:

class Stack
    attr_accessor :top

    def size
            @size
    end

    def push(node)
        if node && node.next
            node.next = top
            top = node
        end
        @size += 1 # @size, not `size` because you have `size` getter and you cannot modify size with getter method
    end

    def pop()
        if top != nil
            top = top.next
        end
        @size -= 1
    end

    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
0 голосов
/ 08 февраля 2012

У ваших def нет соответствия end.Кроме того, в Ruby отсутствует оператор ++;вместо этого вам придется использовать += 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...