В Ruby я понимаю основную идею extend
. Однако что происходит в этом сегменте кода? В частности, что делает extend
? Это просто удобный способ превратить методы экземпляра в методы класса? Почему бы вам сделать это именно так, вместо того, чтобы указывать методы класса с самого начала?
module Rake
include Test::Unit::Assertions
def run_tests # etc.
end
# what does the next line do?
extend self
end
extend self
с этим связано.В модуле self - это сам класс модуля. Так например
вернет грабли так,
в основном делает доступными методы экземпляра, определенные в Rake, так что вы можете делать
источник
Мне всегда помогает думать о том,
extend
чтоinclude
внутри класса singleton (также известный как мета или собственный класс).Вы, наверное, знаете, что методы, определенные внутри класса singleton, в основном являются методами класса:
Теперь, когда мы это знаем,
extend
будутinclude
ли методы в модуле внутри одноэлементного класса и, таким образом, открывать их как методы класса:источник
Чтобы избежать гниения ссылок, ниже публикуется сообщение в блоге Криса Ванстрата, на которое ссылается user83510 (с его разрешения). Тем не менее, ничто не сравнится с оригиналом, поэтому используйте его ссылку, пока она продолжает работать.
→ singletons 18 ноября 2008 Есть вещи, которых я просто не понимаю. Дэвид Боуи, например. Или Южное полушарие. Но ничто так не поражает меня, как синглтон Руби. Потому что на самом деле это совершенно не нужно.
Вот что они хотят, чтобы вы делали со своим кодом:
Но это безумие. Бороться с властью.
А почему бы и нет? API более лаконичен, код легче тестировать, имитировать и создавать заглушки, и его все еще очень просто преобразовать в подходящий класс, если возникнет такая необходимость.
((авторское право должно быть десять Крис Ванстрат))
источник
extend self
включает все существующие методы экземпляра как методы модуля. Это эквивалентно высказываниюextend Rake
. ТакжеRake
является объектом классаModule
.Другой способ добиться эквивалентного поведения:
Это можно использовать для определения автономных модулей с частными методами.
источник