Ruby,从超级调用方法

时间:2015-09-17 13:23:22

标签: ruby

我是一名刚刚进入Ruby的java开发人员。我想做类似以下的事情:

class A
  def foo
    print "foo"
  end
end

class B < A
  loop do
    foo
    sleep 0.5
  end
end

然而Ruby就像foo方法不存在一样,我得到了这个错误:

Test.rb:9:in `block in <class:B>': undefined local variable or method `foo' for B:Class (NameError)
    from Test.rb:8:in `loop'
    from Test.rb:8:in `<class:B>'
    from Test.rb:7:in `<main>'

我实际上无法找到解释这一点的任何地方。

编辑:好的,谢谢,但如果我想做一些像:

class A
    @r = Random.new()
    def foo
        print @r.rand(0...7)
    end
end

class B < A
    def bar
        foo
        sleep 0.5
    end
end

b = B.new()
loop do
    b.bar
end

我收到如下错误: Test.rb:4:在foo': private method rand'中调用nil:NilClass(NoMethodError)     来自Test.rb:10:在bar' from Test.rb:17:in块中'     来自Test.rb:16:loop' from Test.rb:16:in'

为什么ruby继承不允许这样做?

4 个答案:

答案 0 :(得分:3)

在上面的代码中,在B的类定义期间,foo被称为类方法,这就是您收到错误的原因:您的foo方法是实例方法

你可能想要做类似

的事情
class B < A
  def bar
    loop do
      foo
      sleep 0.5
    end
  end
end

答案 1 :(得分:3)

这是因为您已将foo定义为实例方法,而不是类方法。

它将以这种方式工作。

class A
  def self.foo
    print "foo"
  end
end

class B < A
  while true
    foo
    sleep 0.5
  end
end 

答案 2 :(得分:2)

您基本上是在B类的主体内循环。我不知道java开发人员如何困惑你,因为你不能做那样的事情。

由于你提出了来自超级&#34; 的&#34;调用方法,我猜你想要覆盖foo中的B方法无限地呼叫A#foo并睡觉:

class A
  def foo
    print "foo"
  end
end

class B < A
  def foo
    loop do
      super
      sleep 0.5
    end
  end
end

答案 3 :(得分:0)

在您的代码中, foo 的reciver是类本身。

class B < A
  loop do
    foo
    sleep 0.5
  end
end

你应该在一个实例方法中调用你的循环,比如这个

class B < A
  def bar
    loop do
      foo
      sleep 0.5
    end
  end
end