我是一名刚刚进入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继承不允许这样做?
答案 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