Ruby 类中未初始化的常量错误

问题描述 投票:0回答:4

我在 RubyMine 中有这两个类:

book.rb

 class Book
   def initialize(name,author)
   end
 end

test.rb

require 'book'
class teste
   harry_potter = Book.new("Harry Potter", "JK")
end

当我运行

test.rb
时,我收到此错误:

C:/Users/DESKTOP/RubymineProjects/learning/test.rb:3:in `<class:Test>': uninitialized constant Test::Book (NameError)
from C:/Users/DESKTOP/RubymineProjects/learning/test.rb:1:in `<top (required)>'
from -e:1:in `load'
from -e:1:in `<main>'
ruby-on-rails ruby ruby-on-rails-3 rubymine rubymine-7
4个回答
29
投票

您收到错误是因为您的

require 'book'
行需要来自其他地方的其他
book.rb
,而它没有定义
Book
类。

Ruby 不会自动将当前目录包含在它将搜索

require
的目录列表中,因此如果您想要当前目录中的文件,您应该显式地在前面添加
./
,即。

require './book'

10
投票

您已经定义了初始化方法,但忘记将值分配给实例变量,并且代码中的拼写错误触发了错误,将其修复为:

书.rb

class Book
  def initialize(name,author)
    @name = name
    @author = author
  end
end

测试.rb

require './book'
class Test
  harry_potter = Book.new("Harry Potter", "JK")
end

那么,您正在关注哪本书或资源?我认为您至少应该读完一本书才能获得有关 Ruby 和面向对象编程的正确知识。我建议你从《红宝石之书》开始。


7
投票

在 Rails 应用程序中,此错误也可能是由于重命名类而没有重命名文件以匹配而引起的,这是我发现此错误时遇到的问题:

书.rb

class Book
  def initialize(name, author)
  end
end

book_test.rb

class BookTest
  harry_potter = Book.new("Harry Potter", "JK")
end

0
投票

另一个菜鸟错误(我犯的)是在模块内定义一个类,但忘记将其放入文件夹中:

# This file should go inside a folder called `SomeModule` and it should be named `some_class.rb`
module SomeModule
  class SomeClass
    # ...
  end
end

我知道这不是你的情况,因为类定义,但我还是想分享它。

© www.soinside.com 2019 - 2024. All rights reserved.