[英]Ruby, calling method from a super
我是一名剛接觸 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:in foo': private method
rand' call for nil:NilClass (NoMethodError) from Test.rb:10:in bar' from Test.rb:17:in
block in ' from Test.rb:16:in loop' from Test.rb:16:in
'
為什么 ruby 繼承不允許這樣做?
在上面的代碼中, foo
被稱為類方法,在 B 的類定義期間,這就是為什么你得到一個錯誤:你的foo
方法是一個實例方法
你可能打算做類似的事情
class B < A
def bar
loop do
foo
sleep 0.5
end
end
end
這是因為您已將foo
定義為實例方法,而不是類方法。
它會這樣工作。
class A
def self.foo
print "foo"
end
end
class B < A
while true
foo
sleep 0.5
end
end
您基本上是在B
類的主體內循環。 我不明白作為一個 Java 開發人員是如何讓你感到困惑的,因為在 Java 中你不能做這樣的事情。
既然你提出了"calling method from super" ,我猜你想覆蓋B
的foo
方法來無限調用A#foo
並睡眠:
class A
def foo
print "foo"
end
end
class B < A
def foo
loop do
super
sleep 0.5
end
end
end
在您的代碼中, foo 的接收者是類本身。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.