Есть ли в Pharo неизменные структуры данных, такие как карты и наборы, в стандартной библиотеке? - PullRequest
3 голосов
/ 05 марта 2019

Я мог бы просто пропустить их, но я не могу найти упоминания об неизменных структурах данных в Pharo.Исходя из функциональных языков, я нашел неизменную карту и установил ее полезной в различных случаях.Несмотря на то, что у Pharo есть определенный уклон к использованию мутаций, я был бы удивлен, если бы никто еще не удосужился реализовать их.

Ответы [ 2 ]

4 голосов
/ 05 марта 2019

Код в http://source.lukas -renggli.ch / container / реализует современную библиотеку контейнеров и итераторов; с изменяемыми и неизменяемыми списками; неизменяемые виды; и отсортированные, упорядоченные и неупорядоченные наборы и карты структур данных. Он также поддерживает эффективную ленивую итерацию для всех контейнеров, используя обычные операции фильтрации, отображения, выравнивания, разделения, ... ...

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

2 голосов
/ 05 марта 2019

Вполне возможно, что кто-то реализовал что-то подобное. И, возможно, в будущем в составе главной библиотеки будут неизменные коллекции. Однако на данный момент ничего подобного нет, и это по очень простой причине: зачем? Когда я начал изучать Pharo, я был очарован идеей нулевого распространения Objective-C (если вы иметь нулевое значение, и вы отправляете сообщение с нулевым значением, вы возвращаете нулевое значение и т. д.) Итак, первое, что я сделал, это внедрил распространение нуля в Pharo. Это было весело, образовательно и совершенно бесполезно. Это было бесполезно, потому что никто не использует Pharo таким образом, это был неправильный подход для этого контекста. Я настоятельно рекомендую вам сделать свои собственные неизменные коллекции в Pharo.

Но пока вы делаете это, подумайте о том, что должно быть неизменным и почему. Это об уменьшении или увеличении коллекции? Массивы такие - они фиксированного размера. О невозможности добавить / удалить / поменять элементы? Но что, если вы получите элемент и измените его? Наконец, рассмотрим этот пример:

array := #('a' 'b' 'c').

array first become: 'd'.

array = #('d' 'b' 'c')

Я не использую никаких сеттеров, и все же я могу получить другой массив в конце.

Сообщество Pharo заботится о прозрачности и хорошем дизайне. Известно, что вы не должны изменять содержимое коллекций напрямую, вы не должны взаимодействовать с внутренним состоянием объектов извне и т. Д. С другой стороны, никто не ударит вас по лицу, если вы захотите это сделать. , Я имею в виду, что если вы прототип? что если вы взломаете? что если буквально нет другого пути? Вы всегда можете выбирать, вопрос в том, как мы можем помочь людям узнать о лучших вариантах.

P.S. Мой ответ может показаться, что неизменность не важна. Это не тот случай. Были даже прототипы объектов только для чтения , которые можно использовать для обеспечения определенной степени безопасности. Не так просто придумать единую концепцию, которая будет работать для всего хотя

...