0

我在 Ruby 中有以下代码:

class Base
  def Function1
    puts 'Base Function1'
  end

  def Function2
    Function1
  end
end

class Derived < Base
  def Function1
    puts 'Derived Function1'
  end
end

obj = Derived.new
obj.Function2

当我运行上面的代码时,我收到以下错误:

/Users/vkuppuswamy/.rvm/rubies/ruby-2.0.0-p0/bin/ruby -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) /Users/vkuppuswamy/RubymineProjects/TestRubyProj/TestRuby.rb
/Users/vkuppuswamy/RubymineProjects/TestRubyProj/TestRuby.rb:7:in `Function2': uninitialized constant Base::Function1 (NameError)
    from /Users/vkuppuswamy/RubymineProjects/TestRubyProj/TestRuby.rb:18:in `<top (required)>'
    from -e:1:in `load'
    from -e:1:in `<main>'

我可以看到Function2在课堂Base上,已经尝试调用一些常量Function1。我不明白为什么会发生这种情况。我认为Function1将调用派生类方法。当我Function2将基类中的更改为:

  def Function2
    self.Function1
  end

在我调用Function1using的地方self,它可以工作,并且我得到输出:

Derived Function1

你能帮我理解为什么会这样吗?我认为这self在 Ruby 中是隐含的。

4

1 回答 1

5

常量(包括classes)写在 中UpperCase,方法/函数写在lowercase. 这与继承无关,请考虑:

def Foo
  puts 'Foo'
end

Foo
# NameError: uninitialized constant Foo

发生这种情况是因为当 Ruby 看到一个大写标记时,它会寻找一个常量,仅此而已。您可以使用括号明确告诉 Ruby 查找方法,()不要这样做

Foo()
# Foo

请改用小写的方法名称。然后,您的代码将按预期工作:

class Base
  def function1
    puts 'Base function1'
  end

  def function2
    function1
  end
end

class Derived < Base
  def function1
    puts 'Derived function1'
  end
end

obj = Derived.new
obj.function2

这打印

Derived function1
于 2013-06-13T07:24:07.423 回答