为什么模块不总是遵守红宝石中的"需要"?

时间:2020-03-05 18:57:46  来源:igfitidea点击:

(对不起,我应该在第一次发布此代码时就对代码更清楚了。希望这有道理)

文件" size_specification.rb"

class SizeSpecification
  def fits?     
  end
end

文件" some_module.rb"

require 'size_specification'

module SomeModule
  def self.sizes
    YAML.load_file(File.dirname(__FILE__) + '/size_specification_data.yml')
  end
end

文件" size_specification_data.yml

--- 
- !ruby/object:SizeSpecification 
  height: 250
  width: 300

那我打电话的时候

SomeModule.sizes.first.fits?

我得到一个例外,因为"大小"不是Object的SizeSpecification的大小,因此它们没有"适合"的功能。

解决方案

回答

在二读时,我有些困惑,我们似乎想将类混入模块中,这似乎不太可取。 YAML还应该加载SizeSpecifications的数组吗?

看来我们没有将Module混入班级中。如果我在irb中运行测试,则require会引发LoadError。因此,我假设我们将两个文件放在一起,如果不转储的话。

通常,我们将在模块中编写功能,然后将其混合到类中。因此我们可以这样修改代码:

class SizeSpecification
  include SomeModule
  def fits?     
  end
end

然后,我们可以说:

SizeSpecification::SomeModule.sizes

我认为我们也应该能够说:

SizeSpecification.sizes

但是,这需要我们将self移出size方法定义的前缀。

有帮助吗?

回答

设置和红宝石安装可以吗?我创建了这3个文件,并在" test.rb"中写了以下内容

require 'yaml'
require "some_module"

SomeModule.sizes.first.fits?

然后我运行它。

$ ruby --version
ruby 1.8.6 (2008-06-20 patchlevel 230) [i486-linux]
$ ruby -w test.rb 
$

没有错误!

回答

问题代码使我有些困惑。

通常,对于Ruby,如果发生这种情况,这是一个很好的信号,表明我正在尝试以错误的方式进行操作。

提出一个与实际预期结果相关的问题,而不是对问题进行特定"攻击"的细节,可能会更好。他们可以说" nonono,不要那样做,这样做"或者"啊,我现在明白了你想做什么"