ruby 第三章:“超类与类不匹配...”

x4shl7ld  于 2023-01-12  发布在  Ruby
关注(0)|答案(6)|浏览(144)

操作系统:Mac OSX 10.6
在我的终端中,我使用“rails c”启动Ruby控制台
在按照Ruby on Rails 3教程构建类时:

class Word < String 
  def palindrome? #check if a string is a palindrome
    self == self.reverse
  end
end

我得到错误消息:

TypeError: superclass mismatch for class Word
    from (irb):33
    from /Users/matthew/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/railties-3.0.5/lib/rails/commands/console.rb:44:in `start'
    from /Users/matthew/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/railties-3.0.5/lib/rails/commands/console.rb:8:in `start'
    from /Users/matthew/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/railties-3.0.5/lib/rails/commands.rb:23:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

教程显示它没有问题,我知道代码是好的;我搜索了其他相关的问题,但它们都涉及到从Ruby 2迁移到Ruby 3或者erb与eruby。

np8igboo

np8igboo1#

您已经在其他地方定义了一个Word类。我尝试在Rails3应用程序中进行复制,但无法复制。
如果您自己还没有创建第二个Word类,则可能是您的Gem或插件之一已经定义了它。

3npbholx

3npbholx2#

这也可能发生如下情况:

# /models/document/geocoder.rb
class Document
  module Geocoder
  end
end

# /models/document.rb
require 'document/geocoder'

class Document < ActiveRecord::Base
  include Geocoder
end

require在Document < ActiveRecord::Base(具有不同的超类)之前加载Document(具有Object超类)。
我应该注意到,在Rails环境中通常不需要require,因为它具有自动类加载功能。

ruoxqz4g

ruoxqz4g3#

我在使用Rails 4应用程序时遇到了这个问题,我在用户名称空间下使用了concerns。

class User
  module SomeConcern
  end
end

在开发中一切正常,但在生产中(我猜是因为preload_app true)我得到了不匹配的错误。修复非常简单。我只是添加了一个初始化器:

require "user"

干杯!

gjmwrych

gjmwrych4#

有时候我们在不知道的情况下“打开类”。例如,一些深模块嵌套:

# space_gun.rb
class SpaceGun << Weapon
  def fire
    Trigger.fire
  end
end

# space_gun/trigger.rb
class SpaceGun
  class Trigger
  end
end

当我们定义触发器时,我们打开了现有的SpaceGun类。这是有效的。但是,如果我们以相反的顺序加载这两个文件,则会引发错误,因为我们将首先定义SpaceGun类,而不是武器。
有时候我们会犯这个错误,因为我们显式地需要父类的子模块(例如触发器)。这意味着类定义将以相反的顺序完成,从而导致这个问题。

# surely nothing can go wrong if we require what we need first right?
require 'space_gun/trigger'
class SpaceGun << Weapon
  def fire
    Trigger.fire
  end
end
# BOOM

或者
1.依靠自动装载
1.总是将继承放置到每个开放类的示例中。

zzzyeukh

zzzyeukh5#

我现在遇到了同样的问题。基本上这意味着Word在其他地方被定义为一个类,我猜它在rail-ties gem上。只要将Word更改为Word 2,它就可以在教程中正常工作。

ufj5ltwl

ufj5ltwl6#

根据您的具体情况,任何已经提供的答案都可能是您的解决方案。
为了快速方便地找到答案,临时设置config.eager_load = true并启动rails控制台,它应该会立即失败,并显示一条更明确的错误消息,指出正确的文件和行号。
不要忘记在之后将config.eager_load设置回其原始值。

相关问题