簡體   English   中英

Ruby,從超級調用方法

[英]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" ,我猜你想覆蓋Bfoo方法來無限調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM