2016-12-09 3 views
2

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

class Post < Sequel::Model(:my_posts) 
    (...) 
end 

Sequel::Model(:my_posts) устанавливает таблицу базы данных для модели. Мне особенно интересно узнать скобки в Model(:my_posts). Мне нравится этот интерфейс, но как я могу это достичь? Это немного странно ... Кажется, что Model можно назвать методом ... Что это за техника? Может ли кто-нибудь дать мне пример?

+0

Это просто вызов метода с именем 'Model' в объекте, на который ссылается константа' Sequel', передавая символ 'Symbol'': my_posts' в качестве аргумента. Этот метод предположительно возвращает экземпляр класса 'Class', иначе вы получите' TypeError'. –

ответ

4

Обычно, когда вы используете :: с модулем или классом, ruby ​​попытается найти выражение после :: в константах.

Example::First => as constant 
Example::First() => as method 

Выполнить этот код:

module Example 
    class << self 
    def First(a) 
     puts a 
    end 
    end 

    module First 
    end 
end 

Использование:

Example::First(1) # => prints 1 

При использовании class << self вы класс открытый Селф, так что методы могут быть переопределены для текущего объекта самоуправления (который внутри класс или модуль модуля - это сам класс или модуль). Читайте хорошо question/answers на SO.

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

От What are the restrictions for method names in Ruby?

+0

Sequel определил метод 'def_model' (см. [Здесь] (http://sequel.jeremyevans.net/rdoc/classes/Sequel/Model/ClassMethods.html#method-i-def_Model)), чтобы определить метод модели на любом данный модуль – user3033467

Смежные вопросы