2013-03-12 103 views
1

我已经B类从类A衍生,等的访问名称时未初始化的常数:红宝石 - NameError:我的派生类

class A 
.. 
end 

class B < A 
... 
end 

在另一文件I中定义的变量M

M = B 

然后我得到了错误

"NameError: uninitialized constant B". 

我发现,如果我写

M=A 
M=B 

然后就可以了。看来我必须以某种方式初始化A.

+0

为什么不继续前进,做一个电话? – sawa 2013-03-12 17:42:51

+0

我以此作为临时的方式。我只是觉得这不太自然。我猜,Ruby应该有它的语法解决方案。 – user1991452 2013-03-12 18:01:55

+0

这没有任何意义,你使用的是什么版本的红宝石? 我只是做了以下test.rb类A 结束 B类 Mike 2013-03-12 18:10:36

回答

0

由于文件与rails没有任何关系,我们假设它们是系统上任何文件夹中的两个独立文件。 假设他们在同一个目录中。

class_def.rb:

class A 
    def self.talk 
    puts 'hello' 
    end 
end 

class B < A 
    def self.talk 
    super() 
    puts 'world' 
    end 
end 

runner.rb:

require './class_def.rb' 
M=B 
M.talk 

调用红宝石runner.rb应该产生输出

hello 
world 

但是我注意到使用RubyFiddle同样的错误

瓦特/的方法http://rubyfiddle.com/riddles/1d8e2

呼叫W/O的方法http://rubyfiddle.com/riddles/1d8e2/

+0

事情是类A和B在同一个文件中,而我从另一个文件访问它们。我可以在没有这个需求声明的情况下访问A,那么访问B时为什么需要这个? – user1991452 2013-03-12 20:34:44

+0

如何在不需要文件的情况下访问A?你一定在做一些你没有说的东西。 – Mike 2013-03-13 16:25:03

+0

这是一个红宝石项目。我把我的类定义文件放在app/models目录下,rails应该自动需要这个文件。我必须强调,我的类A不是ActiveRecord的子类。它只是独立的。 – user1991452 2013-03-14 00:03:42