在主范围内包含或扩展

时间:2015-03-08 13:06:43

标签: ruby

在整个互联网上,我看到人们使用“include”为主要范围带来新功能。

最近,我在SO回答中看到了这一点:

require 'fileutils' #I know, no underscore is not ruby-like
include FileUtils
# Gives you access (without prepending by 'FileUtils.') to
cd(dir, options)
cd(dir, options) {|dir| .... }
pwd()

扩展工作也是如此,但根据我的理解,只有扩展应该工作。我甚至不知道为什么主要对象具有包含功能。

在主要范围内:

self.class == Object  #true
Object.new.include    #NoMethodError: undefined method `include' for #<Object:0x000000022c66c0>

我的意思是逻辑上,因为self.is_a?(Module) == false在主范围内时,main甚至不应该具有include功能,因为include用于向子实例添加方法而main不是类或模块所以没有儿童实例可以谈论。

我的问题是,为什么包括在主要范围内的工作,导致它在那里工作的设计决策是什么,最后,我们不应该在这种情况下“延伸”以便不做“扩展/包含“功能更加令人困惑,这要归功于人们经常使用ruby hook来调用另一个人来调用另一个。

1 个答案:

答案 0 :(得分:3)

main范围是&#34;特殊&#34;。在main范围定义的实例方法成为private的{​​{1}}实例方法,常量变为Object的常量,Object包含在include中。可能还有其他我想念的东西。 (例如,Object假设prepend,我从未想过它。直到现在。)