method_name =如何在引擎盖下工作?

时间:2015-09-08 01:09:39

标签: ruby attr-accessor

我在Ruby中破解了链接列表的简单实现,但我发现了一些非常特殊的内容。

我创建了一个let wishes = searchDataBase() 类,Listattr_accessor。像这样:

first_node

然后,在实现方法class List attr_accessor :first_node # Some code here ... end 时,我遇到了以下错误

delete_at

这是方法的一部分:

linearly.rb:39:in `delete_at': undefined method `next' for nil:NilClass (NoMethodError)
    from linearly.rb:81:in `<main>'

我忘了使用类变量def delete_at(position) if position == 0 deleted_node = first_node first_node = first_node.next # This is line 39. return deleted_node else # More code here ... ,而是使用了读者方法@first_node。然后,我开始想知道为什么first_node在同一行中使用first_node时返回nil

在设置新值之前,是否将first_node=设置为@first_node

请注意,这段代码工作正常:

nil

修改

这就是我调用实现的方式:

def delete_at(position)
  if position == 0
    deleted_node = first_node
    first_node = deleted_node.next

    return deleted_node
  else
    # Some code here ...

2 个答案:

答案 0 :(得分:3)

此:

first_node = first_node.next

创建一个名为first_node的局部变量。变量声明被提升到Ruby的范围顶部,因此您的方法等同于:

def delete_at(position)
  deleted_node = nil # Declare deleted_node and first_node
  first_node = nil   # as local variables.
  if position == 0
    deleted_node = first_node
    first_node = deleted_node.next

    return deleted_node
  else
    # Some code here ...

这意味着您的方法中的所有first_node引用都将是本地first_node变量,而不是attr_accessor为您创建的getter和设置方法。

要么不使用与方法名称匹配的变量,要么通过为方法调用提供self接收器来明确您的意思:

def delete_at(position)
  if position == 0
    deleted_node = self.first_node
    self.first_node = deleted_node.next
    #...    

答案 1 :(得分:0)

你确定已经设置了@first_node吗?未设置时,实例变量将返回nil。

class Test
  attr_accessor :foo
  def print_foo
    puts "@foo=[#{@foo}]"
    puts "foo=[#{foo}]"
    puts @foo.nil?
  end
end

t1 = Test.new
t1.foo # => nil
t1.print_foo  # prints "@foo=[]" and "foo=[]" and returns true