Изучая Ruby, в который раз вспомнил выражение "всё новое - хорошо забытое старое". Чаще даже не забытое, а просто неизвестное.
Сейчас освновным и, пожалуй, единственным языком программирования которым я владею является С++. Немного знаю JScript, когдато давно некоторое время писал на perl, еще раньше на паскале, а начиналось все с бейсика. Не густо. Именно поэтому так многое удивляет в Ruby. Очень удивило, что здесь все переменные - ссылки на объекты, и очень понравился фокус со строками:
Оказывается, что ново это только для меня. На самом деле, механизм, когда переменная - это только ссылка на объект, уже давно исползовался в других языках программирования (Java, Python). И подобных механизмов, которые уже где-то используются еще много. Например, переменная self используется и в Python'e, а не только аналогична C++'овскому this. Вызов методов, через посылку объекту сообщения используется в Smaltalk'e. И так далее.
Это похоже на путешествие: ты посетил одну страну, страна понравилась, получил массу впечатлений, казалось бы, что может быть лучше... но потом ты едеш в другую страну и видиш, что там есть вещи не хуже, а то и лучше чем в первой и тебе уже интересно, а что же есть еще и в чем разница.
Величина моего удивления, обратно пропорциональна моему незнанию механизмов, используемых в различных языках программирования. Это ведет к пониманию того, что незнание многих, широко применяемых механизмов, не позволяет судить о каком либо языке как о самом что нинаесть лучшем. Это я к тому, что до сих относился с некоторым пренебрежением к остальным языкам, особенно к скриптовым, основываясь восновном на убежнении, что С++ - это круто и сложно. Похоже пришло время менять убеждения. Вокруг столько интересного, что зацикливаясь на чем-то - лишаешь себя многого.
пятница, 14 сентября 2007 г.
Изучая Ruby...
Автор:
sash_ko
на
12:22
1 коммент.
Ярлыки: Программизм, Ruby
среда, 12 сентября 2007 г.
Классы и объекты в Ruby ч.2
Наследование в Руби.
Руби не поддерживает множественного наследование. Но если необходимо использовать функциональность нескольких классов предлагается компромисное решение - смеси.
Для указания наследования одного класса другим используется символ "<":
Если классу посылается сообщение с именем метода, который необходимо вызвать, но такой метод не найден в описании класса, поиск выполняется в описании класс предка и.д. Если метод не найден - вызывается метод Object#method_missing и выдается ошибка. Но этот метод можно переопределить.
При переопределении метода можно использовать метод родительского класса:
super вызывает метод базового класса с таким же именем как и метод, в из которого вызывается super. Точно так же super используется для метода initialize.
Права доступа.
В Руби есть 3 типа прав доступа:
- public - метод может вызываться кем угодно, устанавливается по умолчанию
- private - метод может вызываться наследниками, но только в контексте одного объекта
- protected - метод может вызываться наследниками не только в контексте одного объекта
Указание типа аксессора можно выполнять двумя способами:
Попробуем сотворить какую нибудь иерархию классов, что бы посмотреть как все это работает. Допустим есть канва, на которой рисуются объекты, причем сначала рисуются объекты большей площади.
Если в Shape area будет объявлена как private, то в процессе выполнения получим ошибку: in 'greater_area': private method 'area' called for #<>, так как area доступна только в контексте одного объекта.
Автор:
sash_ko
на
20:12
0
коммент.
Ярлыки: Программизм, Ruby
Чешская мечта
"Чешская мечта" - так называется 10 дневный автобусный тур в Чехию с оставновкой в Польше (Краков) по пути в Чехию и обратно. Хочу вкраце поделиться своими впечатлениями.
Организация тура.
Тур был организован туристической компанией Альянс. Автобус - обычный среднестатистический Neoplan с туалетом, которым пользоваться нельзя (дабы пассажиры не задохнулись) и чаем/кофе только на остановках. Туристов сопровождал руководитель группы (Елена Васильевна). В Кракове и Праге группу водили русскоязычные гиды (Ирина и Виталий). Из организации больше всего понравилось, что всем была выдана карта Праги :).
Программа тура.
Как видно из программы первый и последний день практически целиком к самой программе не относится и время самого тура сокращается до 8 дней.
2-й день.
Выезд со Львова и прибытие на границу. Прохождение границы у нас заняло около 5 часов, из которых на украинскую границу выпало от полу часа до часа. По словам руководителя тура это ещё не так долго... Но в задержке на польской грацице виноваты сами украинцы, т.к. жители приграничных районов мешками тащат и провозят контробадные сигареты и спирт и таможеникам приходится очень чшательно досматривать каждый автобус. Возможно такое положение дел изменится после вступления Польши в Шенген.
Пока автобус дожидался своей проверки, можно было понаблюдать как контрабандисты проносят сигареты через границу. Очень забавное зрелище :)
По территории Польши автобус ехал очень медленно. С одной стороны, виной этому были постоянные пробки и ремонтные работы на дорогах, с другой стороны, по словам руководителя группы, очень жесткие ограничения по скорости. В итоге, в Краков мы прибыли когда уже стемнело, около 9 часов вечера (или около того, чтоно не помню), при том, что в отель нам надо было попасть к 11 часам. Поэтому аквапарк мы не посещали и галопом пробежались по основным достопримечательностям.
3-й день.
С самого утра большая часть группы отправилась на час в аквапарк (к 8 утра), остальных высадили недалеко от Вавеля. У тех, кто не поехал в аквапарк была реальная возможность посмотреть центр Кракова и Вавель. Остальная группа прибила из аквапарка после 10 часов и, объединившись с остальными, галопом понеслась по Вавелю и посмотрела далеко не все. Потом было немного свободного времени и в 14 часов мы отправились в сторону Праги, куда прибыли поздно вечером.
4-й день.
Наконецто мы увидели Прагу. Сначала была обзорная экскурсия с гидом с 9 до 13 часов. Сразу же после этого, всем желающим было придложено покататься на теплоходе по Влтаве (с 13 до 15), а в 18 часов сходить в абсент бар (на 2 часа, 20 евро). Дальнейшая программа в этот день не известна, так как после обзорной экскурсии я со своей второй половиной поехал посмотреть крепость Карлштейн.
5-й день.
Поездка в Карловы Вары с посещением всяких там заводов. Дабы не терять время на посещения всяких заводов, мы поехали туда самостоятельно на рейсовом автобусе, что оказалось дешевле в 4 раза и позволило провести там больше времени.
6-й день.
Экскурсия по Пражскому граду (с 9 до 13). Отказавшись от экскурсии мы поехали сначала в пражский зоопарк (потрясающий зоопарк), замок Троя, а уже потом посмотрели Карлов мост и Пражский град (в это время людей там было уже не так много).
7-й день.
Поездка в Чешский Крумлов с заездом в крепость Глубока над Влтавой. Посещение Глубоки над Влтавой заняло час или полтора. В Крумлове посещение туристического ресторана. В Прагу вернулись около 9 часов вечера...
8-й день.
Выселение из гостиницы. Выезд в направлении Кракова. По пути на час заезд в Чешский Штернберг и на пару часов в Кутну Гору. Посещение Костницы заняло минут 20. В Кутной Горе обед в туристическом ресторане, с немного завышенными ценами. Позно вечером приезд в Краков.
9-й день.
Выселение из гостиницы и поездка в Величку. 2 часа экскурсии в шахте и пол часа на покупку сувениров. После успешного прохождения всех границ, прибытие во Львов в 8 часов вечера.
На 10-й день Чешская мечта у нас закончилась и начались 2 дня Львовской мечты :)
Итого:
2 полных дня в Праге
2.5 дней в других городах Чехии
0.5 дня в Кракове
2.5 часа в Величке
2 дня во Львове (самостоятельное дополнение к туру :)
Впечатления от тура в следующем посте...
Автор:
sash_ko
на
15:16
1 коммент.
Ярлыки: Путешествия
Классы и объекты в Ruby ч.1
Классы в Ruby обозначаются словом class. Причем имя класса должно начинаться с большой буквы (а методы с маленькой); иначе получена ошибка: class/module name must be CONSTANT.
Объект класса создаётся посылкой сообщения new (в Руби методы класса вызываются путем посылки сообщения с именем метода объекты класса). Когда создаётся объект, в описании класса ищется метод initialize и вызывается:
Переменные экземпляра класса имеют имена, начинающиеся с символа @. Для различных объектов одного и того же класса эти переменные могут быть различны. К этим переменным нет доступа снаружи объекта (ни на чтение ни на запись), только через методы объекта. По умолчанию эти переменных инициализируются nil. Декларировать эти переменные не нужно, они добавляются к объекты при первой ссылке на них. Добавить методы доступа к переменным достаточно просто:
Здесь @issue и @vendor доступны для чтения, @model и @price - для записи.
В Руби существует особая переменная self которая ссылается на вызывающий метод объект (по аналогии с this C++).
Помимо переменных экземпляра класса есть переменные класса (статические переменные в С++). Эти перменные обозначаются с приставкой @@. Значение такой переменной одинаково для всех экземпляров одного и того же класса.
Так же в класс можно добавлять константы, которые именуютс с большой буквы:
Так же как и переменные методы тоже делятся на два типа: методы класса (статические в С++) и методы экземпляра класса. При объявлении методов класса указывается имя класса:
Все классы, для которых не указан предок, автоматически наследуются от Object, поэтому имеют минимальный общий набор методов, например, clone, id, inspects, to_s и т.д.
Автор:
sash_ko
на
14:12
2
коммент.
Ярлыки: Программизм, Ruby
четверг, 30 августа 2007 г.
Неоконченное путешествие
После книг Рериха "Алтай-Гималаи" и Кастере "Моя жизнь под землей" решил продолжить чтение книг из серии: "ХХ век: Путешествия. Открытия. Исследования."
Следующей стала книга "Неоконченное путешествие" Перси Фоссета. Из всех трех прочитанных книг из это серии, эта является самой яркой и насыщенной приключениями и событиями. То, о чем писал полковник Фоссет впечатлило Артура Конан Дойла (с которым он был знаком лично) написать "Затерянный мир". Сам полковник, стал прообразом проффесор Челленджера.
Книга была издана сыном Перси Фоссета и составленная на основании его писем и дневников, так как сам исследователь так и не вернулся из своего последнего путешествия...
О чем эта книга.
Полковник Перси Фоссет, англичанин, военный топограф, волею судьбы попал в Южную Америку, для установления точных границ между Боливией и Перу и нанесением их на карту (шол 1906-й год). Это была его первая экспедиция в джунгли Южной Америки, которая длилась 15 месяцев. То, с чем он там столкнулся, навсегда изменила его жизнь, заставило оставить бросить службу в армии и посвятить всю оставшуюся жизнь исследованию непроходимых тропических джунглей.
В местах, которые, казалось бы, совершенно не пригодны к жизни и враждебны к человеку (по крайне мере, по отношению к европейцам), он познакомился с культурой индейцев, которая, как считал полковник, уходит своими корнями глубоко в историю. Историю более древнюю чем история инков. Именно на поиски городов доинковской цивилизации он и потратил свою жизнь, приобщив к этому своего старшего сына.
Чем книга примечательна и что меня впечатлило.
В се, что описано в книге - реальные воспоминания реального человека. Все с чем он столкнулся - было по настоящему.
Первое что меня по впечатлило - это сами джунгли. Они могли представлять user friendly интерфейс для туристов. Чего тут только не было. Богатый мир насекомых, но не только красивые жуки и бабочки. Целая тьма всевозможных кровососущих, жалящих, кусающих насекомых, от которых не спасала никакая противомоскитная сетка: всевозможные мошки, мухи, мушки, москиты, много видов ос, муравьев, пауков, клещей. Очень запомнились агрессивные осы, которые старались жалить в глаза и мухи, которые откладывали личинки под кожу человека.
Но насекомые это еще не смертельно, а вот сотни видов змей, это вам не это! Особенно меня поразили анаконды, которых не всегда удавалось убить из ружья 24-го калибра...
Джунгли полны рек, а реки полны своими обитателями: пираньи, крокодилы, теже анаконды, ядовитые скаты и куча еще всяких приятных рыбок...
Помимо специфической фауны, здесь были сотни смертельных болезней (всякие лихорадки, бери-бери и тому подобные радости). Хотя болезни, в большей степени были результатом образа жизни местного населения.
Вообщем мрачная картина. Но жалеть местных жителей того времени не стои. Они довольно весело относились к болезням и смерти. Тот кто заболевал смертельной болезнью и корчился в муках, сразу становился предметом насмешек. Фоссет описывает много таких случаев. Например, когда рыбака ели пираньи, собралась вся деревня и хохотала. Или когда расстреливали преступника, все жители собирались на пикник, на месте казни, брали детей и шли развлекаться. Но особенно в это преуспевали "цивилизованные" индейцы. И смертность там, по словам Фоссета, была просто невероятной.
И вот со всем этим сталкивался Фоссет, но жажда исследований, раскрытия секретов древних цивилизаций была сильнее. Но не только это. После первой экспедиции, вернувшись в Англию, полковник понял, на сколько искуственный весь цивилизованный мир. Только в джунглях он начал чувствовать себя настоящим человеком. И он был не одним таким...
Хотелось бы много хорошего написать об этой книге, но уж лучше прочитать самому. Лучше чем уже есть не напишешь :)
Автор:
sash_ko
на
12:28
3
коммент.
Ярлыки: Путешествия, Чтиво
вторник, 28 августа 2007 г.
Ruby: первая кровь 2
Вызов методов. Методы вызываются путем посылки объекту сообщения с именем соответствующего метода (Так же как это делается в Smalltalk). На практике, посылка сообщений объекту выглядит не так страшно, как звучит:
Параметры метода можно указывать как в скобках, так и без них. Следующие вызовы метода эквивалентны:
Блоки. Очень интересная штука в Руби - это блоки - куски кода в фигурных скобках или do...end. Блоки ассоциируются с вызовами методов, т.е. нечто вроде колбека. Для вызова блока применяется yield:
callBlock дважды выводит "In the block".
Автор:
sash_ko
на
20:45
2
коммент.
Ярлыки: Программизм, Ruby
Интерактивный Ruby
Автор:
sash_ko
на
20:14
0
коммент.
Ярлыки: Программизм, Ruby