为什么模块不总是遵守红宝石中的"需要"?
时间: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,不要那样做,这样做"或者"啊,我现在明白了你想做什么"