LINUX.ORG.RU

Философия Ruby

 ,


1

3

Читаю исходники стандартной библиотеки

require "rss/0.9"
module RSS
...
end
и в процессе чтения до меня доходит что модуль был переоткрыт и сейчас расширяется! У меня вопрос: зачем так делать? Почему бы просто не использовать наследование? Зачем вообще нужен манки-патчинг? Код становится на порядок запутанее. В том же С# для определения класса в разных файлах используется ключевое слово partial, ага значит определение может быть где то еще.



Последнее исправление: ymn (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

не, модули не подходят. Импортируемый код исполняется всегда на верхнем уровне вложенности. То есть

module MyModule
    require "something"
end
MyModule::...
не проканает.

RA
() автор топика
Ответ на: комментарий от Alve

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

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

RA
() автор топика
Ответ на: комментарий от RA

не, модули не подходят. Импортируемый код исполняется всегда на верхнем уровне вложенности

Я говорил о том, что само содержимое "something" должно быть обёрнуто в модуль.

не проканает.

Естественно. Смотри это сообщение: Философия Ruby (комментарий)

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Вот, например, такое решение: https://github.com/dreamcat4/script/blob/master/lib/script.rb

Объявляется подкласс Module, который определяет синглетон-метод load (на самом деле alias на new). При вызове load в контексте экземпляра вычисляется содержимое переданного файла, при этом у экземпляра переопределены load и require, чтобы импорт внутрь пространства имен имел рекурсивный характер. В результате получаем то, что тебе нужно. Вроде никакой особой магии в этом нет.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Можно написать аналог или враппер для этого кода, чтобы сымитировать поведение питоновского import:

import "this/long/name" # => определяет константу `This::Long::Name` с содержимым загруженного модуля
import "this/long/name", as: :Name # => Name

Вопрос только в том, нужно ли это.

Селективный импорт написать сложнее, хотя мне кажется, что это возможно.

theNamelessOne ★★★★★
()
Ответ на: комментарий от RA

как в питоне

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

special-k ★★★★
()

Зачем вообще нужен манки-патчинг?

Для гибкости. Однако в стандартной библиотеке такое выглядит как минимум нелепо.

annulen ★★★★★
()
Ответ на: комментарий от special-k

что значит ключевая фишка?

from MyModule import *
точно так же затрет в глобальном неймспайсе функции и классы.

RA
() автор топика
Ответ на: комментарий от special-k

сам то понял что написал?

написанный и даже работающий по праздникам код является неподдерживаемым куском говна

на любом языке реализуемая задача)

утинизмами

что это?

RA
() автор топика
Ответ на: комментарий от RA

на любом языке реализуемая задача)

я рад за тебя)) но тем, кто столкнется с твоим кодом, я сочувствую.

затрет в глобальном неймспайсе функции и классы

Круто, но причем здесь руби)) В питоне нет аналогов модулей руби вообще.

Ты самостоятельно можешь обертывать сущности в зависимости от директории, это даже считается неплохой практикой. Так же как и хранить одну сущность в одном файле.

Что бы все что мы импортировали ложилось в какой нибудь namespace?

Нахрена эти сюрпризы.

special-k ★★★★
()
Ответ на: комментарий от special-k

Нахрена эти сюрпризы.

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

special-k ★★★★
()
Ответ на: комментарий от special-k

Глобальный неймспейс - одна из ключевых фишек руби

что значит ключевая фишка?
..точно так же затрет в глобальном...

Круто, но причем здесь руби))

ты нить разговора сразу забываешь? Что за фишка такая «глобальный неймспейс»? Когда все в куче? Это реально (нужная) фишка и такого нельзя достичь в других языках?

Что бы все что мы импортировали ложилось в какой нибудь namespace?

Нахрена эти сюрпризы.

Блин какие сюрпризы? То что имя модуля который ты импортируешь становится неймспейсом?

Ты наверное от программировании дальше чем я

RA
() автор топика
Ответ на: комментарий от RA

Когда все в куче?

Когда все на своем месте.

такого нельзя достичь в других языках?

Всегда можно эмитировать поведение, только это, как правило будут костыли. Например, я хотел сделать реализацию для js, но пока отказался от этой идеи. В jruby, так и вовсе сделано, что ява машина работает данным образом.

Блин какие сюрпризы?

Такие, блин, сюрпризы. Есть класс ClassName, а у тебя он почему-то называется another_class_name. Это сюрприз - еще какой. Имена классов и модулей это то, что не нужно менять.

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 3)
Ответ на: комментарий от RA

А есть возможность как в питоне проводить импорт? Что бы все что мы импортировали ложилось в какой нибудь namespace?

С открытыми классами в этом мало смысла. Обернуть то можно, но что делать, если подключаемая либа манкипатчит Kernel например? По сути это равнозначно засорению «глобального неймспейса». Нужно просто принять, что это не питон. Здесь собственно и нет никакого глобального неймспейса, а только контекст текущего self, который зависит от иерархии классов и подключенных миксинов. Хочешь (относительно) чистый неймспейс - наследуйся от BasicObject.

Hjorn
()
Ответ на: комментарий от RA

Это реально (нужная) фишка

В системе всегда есть точки монтирования, которые постоянны, вокруг которых строятся остальные элементы. Это наблюдается где угодно, в файловой системе (например если ты внезапно переименуешь bin в AnotherBin, это плохо кончится), в сервисах dbus, в веб-сервисах в виде path (где физически находится сам сервер реализующий функционал по path никому не важно, их вообще может быть несколько). Так же и здесь, пространство имен является точкой монтирования функционала, и в конечном счете дает тебе API, реализация которого отходит на второй план и может заменяться.

special-k ★★★★
()
Ответ на: комментарий от special-k

я понял свою ошибку, я привожу параллель с python, а ты его не знаешь... Читкани как делается импорт в pythone и приходи назад

RA
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.