如何添加到包含的模块

时间:2018-03-13 16:09:47

标签: ruby

考虑以下代码,理想情况下我可以引用Shelf::Things::ThingOneShelf::Things::ThingTwo

module Things
  class ThingOne
  end
end

class Shelf
  include Things
  module Things
    class ThingTwo
    end
  end
end

Shelf::Things.constants # => [:ThingTwo]

module Things的第二个宣言覆盖了第一个宣言。是否可以重新打开一个包含的模块,以便更多(例如)类可以嵌套在其中?

编辑:事实证明这并不是我想要回答的问题。我已经要求进行跟进,here

3 个答案:

答案 0 :(得分:4)

  

模块resolve({nameTaken: true});的第二个声明覆盖了第一个

不,它没有。 Things是一个与Shelf::Things完全无关的模块。

::Things
  

理想情况下,我可以引用Things.constants # => [:ThingOne] Shelf::Things.constants # => [:ThingTwo] Shelf::Things::ThingOne

Shelf::Things::ThingTwo

但是,正如其他答案中已经暗示的那样,这是非常单一的,这种继承"常量。很可能你为这份工作选择了一个错误的工具,但自we don't know the actual job以来很难说。

答案 1 :(得分:1)

当您将模块包含到类中时,它们的方法包括在内,而不是类。因此,在完成您所做的工作后,您可以使用Things::ThingOne个实例中Shelf的方法。

如果要使用Shelf::Things::ThingOneShelf::Things::ThingTwo,则需要在模块中嵌套两个声明(Ruby中的模块和类可以在多个文件中定义):

# file shelf/things/thing_one.rb
module Shelf
  module Things
    class ThingOne
    end
  end
end

# file shelf/things/thing_two.rb
module Shelf
  module Things
    class ThingTwo
    end
  end
end

另见this answer

答案 2 :(得分:0)

看起来你故意重写模块public class MainVM { public ObservableCollection<Thingy> Thingies { get; set; } public ICommand FooCommand { get; set; } public MainVM() { Thingies = new ObservableCollection<Thingy>(); FooCommand = new Command(Bar); } private void Bar(object eventArgs) { var args = eventArgs as SelectedItemChangedEventArgs; if (args == null) return; var selectedItem = args.SelectedItem; } } ,在Things内嵌套ThingTwo类,要求ruby在Shelf类中查找常量。您不必两次声明相同的模块,请尝试:

Shelf

你会得到

module Things
  class ThingOne
  end
end

class Shelf
  include Things
  class ThingTwo
  end
end