RubyMonk 8.2模块作为命名空间

时间:2015-11-30 22:03:45

标签: ruby

总的来说,我无法理解Ruby中的一些概念,模块就是其中之一。

我正处于RubyMonk 8.2的最后一步:作为命名空间的模块,我很丢失。我该怎么办?我的计划是获得解决方案并对其进行逆向工程,但是没有解决方案按钮,所以我被卡住了:(

说明如下:

如果你在没有父项的情况下使用::前置一个常量,那么范围就会发生在最顶层。在本练习中,在Kata模块之外的最高级别中,按照A = 10更改push返回10。

已经填写的代码是:

module Kata
  A = 5

  module Dojo
    B = 9
    A = 7

    class ScopeIn
      def push
       A
      end
    end
  end
end
A = 10

2 个答案:

答案 0 :(得分:1)

所以,你想要这个:

module Kata
  A = 5  
  module Dojo
    B = 9
    A = 7

    class ScopeIn
      def push
       ::A # change this line from A to ::A, meaning ::A will refer to the top-level namespaced A which is defined outside the Kata module (A = 10)
      end
    end
  end
end

A = 10
p Kata::Dojo::ScopeIn.new.push
# => 10

如果在没有父项的情况下使用::添加常量,则范围发生在最顶层。在此示例中,push将返回10,因为A = 10位于Kata模块之外的最顶层。

答案 1 :(得分:1)

module Kata
  A = 5
  module Dojo
    A = 7
    class ScopeIn
      def push0
        A
      end
      def push1
        Kata::Dojo::A
      end
      def push2
        Kata::A 
      end
      def push3
        ::A
      end
    end
  end
end
A = 10

scope = Kata::Dojo::ScopeIn.new #=> #<Kata::Dojo::ScopeIn:0x007fe63c8381d0> 

scope.push0 #=>  7 
scope.push1 #=>  7
scope.push2 #=>  5 
scope.push3 #=> 10