2014-12-31 4 views
2

Я знаком с модулями, предоставляющими доступ класса к методам экземпляра, включенным в модуль, но я не видел модулей, предоставляющих классы доступ к локальным переменным.Необычное использование пространства имен модулей

Вот файл A:

module SequelPlayground 
    class Article 
    attr_reader :title, :body, :author_id, :id 
    def initialize(attributes) 
     @title   = attributes[:title] 
     @body   = attributes[:body] 
     @author_id = attributes[:author_id] 
     @id   = attributes[:id] 
    end 
    def self.next_id 
     table.count + 1 
    end 
    def self.table 
     DB.from(:articles) #SELECT * FROM articles 
    end 
    end 
end 

Вот файл B:

module SequelPlayground 
    DB = Sequel.postgres("sequel-playground") 

    class Server < Sinatra::Base 
    get '/' do 
     erb :index 
    end 
    end 
end 

Почему файл A имеют доступ к локальной переменной DB? Являются ли что-либо внутри модуля в том же пространстве имен даже между файлами?

+0

«DB» - это константа на уровне модуля, а не локальная переменная (по правилу верхнего регистра). –

+1

Ruby решит это, я считаю, в локальной области, затем поиск вверх по классам, модулям, вплоть до глобальной области. –

+0

Интересно ... Я никогда этого не знал. Итак, в файле A он ищет БД локально, затем модуль, а затем глобально? – Jwan622

ответ

1

Почему файл A есть доступ к местной переменной DB?

Потому что это не локальная переменная. Локальные переменные начинаются с строчных букв. Это константа, потому что она начинается с буквы верхнего регистра.

Константы просматриваются как лексически в текущей области видимости, так и все охватывающие области (например, локальные переменные во вложенных блоках, например) и динамически в текущем классе или модуле и во всех его суперклассах.

0

DB - постоянная уровня модуля. поэтому он доступен в обоих файлах.