要学习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
答案 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
是+
加法运算符(Fixnum
是size
),第二个Fixnum
是一元加+
的运算符( nil
表达式的结果。
使用def pop()
和+= 1
代替-= 1
和++
。您的代码应如下所示:
--
答案 1 :(得分:0)
您的def
没有匹配的end
。此外,Ruby没有++
运算符;你必须改为使用+= 1
。