Leon's Blogging

Coding blogging for hackers.

Ruby - A::B vs Module a; Class B

| Comments

在 ruby 中,A::B 相當於 module A; class B 但實際上會稍微有點不同的地方

module A; class B

module Aclass B 中間宣告的變數,會變成屬於 A module 的 scope,而 class B 也包在 module A 底下,因此可以訪問到 parent 的變數

A::B

而在 A::B 裡面宣告是屬於 A::B 的 scope (也就是 class B)

Example

module A; class B

  1. class B 會 search 有沒有 SCOPE?
  2. 沒有就往上層找 module A 有沒有 SCOPE?

A::B

  1. class A::B search 有沒有 SCOPE?
  2. 沒有往上層,就到了 global,並沒有 module A 這層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SCOPE = 'global'

module A
  SCOPE = 'module A'
  class B
    def scope1
      SCOPE
    end
  end
end

class A::B
  def scope2
    SCOPE
  end
end

A::B.new.scope1 # => "module A"
A::B.new.scope2 # => "global"

module A; class B

  1. class B 會 search 有沒有 SCOPE? 在 class A::B 已經有設定 scope 因此取得

A::B

  1. class A::B search 有沒有 SCOPE?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SCOPE = 'global'

module A
  class B
    def scope1
      SCOPE
    end
  end
end

class A::B
  SCOPE = 'A::B'
  def scope2
    SCOPE
  end
end

A::B.new.scope1 # => "A::B"
A::B.new.scope2 # => "A::B"

參考文件

Comments