Атрибут в руби по сути это переменная экземпляра класса (instance variable), имя которой всегда начинается с символа @. Получить доступ к атрибуту за пределами класса напрямую нельзя. Для чтения атрибута используется reader-метод, а для установки значения атрибута используется writer-метод. Либо в этих же целях можно при необходимости использовать методы instance_variable_get и instance_variable_set.
Для удобства определены методы модуля attr_reader и attr_writer, которые создают методы для чтения и записи указанных атрибутов. Также существует метод attr_accessor, который создает и reader-, и writer-метод.
По соглашению имя геттера и сеттера (ридера и врайтера) атрибута "@attribute" будут называться attribute и attribute= соответственно.
Исходя из этого имеем:
self.foo — вызов метода, который может являться геттером атрибута @foo foo — вызов метода, который может являться геттером атрибута @foo @foo — чтение атрибута (переменной экземпляра)
В статье утверждается, что self.foo необходимо использовать при присвоении. Это так, потому что foo = 5 это создание и присвоение локальной переменной. А self.foo = 5 это вызов writer-метода foo=(5).
Спасибо, ваше решение весьма интересное и очень кстати, два unwrap без проверки, правда, немного смущают. Но вообще я больше жаловался на сложности работы с разными числовыми типами, где нужны постоянные касты. После других языков это кажется избыточным и некрасивым, хотя с другой стороны заставляет больше задумываться о дизайне кода.
Изначально начал так реализовывать, когда взялся самостоятельно писать метод. Производительность в принципе может пострадать, но массив с пикселями тоже можно перевернуть, да и задача здесь все-таки не в производительности.
Очень понравился ваш цикл статей, поэтому я, что называется, решил совместить полезное с полезным и написать рендерер на расте.
К сожалению пока не успел догнать вас, нахожусь лишь на третьем шаге. Имеется голова с диффузной текстурой. Сейчас по-моему удалось избавиться от артефактов, которые по всей видимости возникают из-за арифметики с плавающими числами. Т.к. раст не позволяет автоматически конвертировать числовые типы, то чтобы не приводить числа по десять раз туда-сюда в каждой строчке я передаю в функцию triangle векторы с дробными координатами и оперирую ими до самого вывода пикселя. К тому же треугольник я отрисовываю не горизонтальными полосками, а вертикальными. В результате мое изображение немного отличается от вашего, приведенного в третьей статье. Например, есть достаточно заметное отличие на веке левого глаза.
Картинка
Код выложен на гитхабе, может быть кому-то еще будет интересно. Или опытные «растаманы» подскажут мне, что можно улучшить :)
На самом деле неоднозначность можно решить, если обязать начинать все идентификаторы с большой буквы. А без такого правила в большинстве случаев может возникать неоднозначность.
По поводу вашего примера. Если ввести оператор is для определения перменных, то необходимо запретить идентификаторам содержать подстроку «is». Иначе полчим, что Connection is ready is Boolean — весьма неоднозначная конструкция.
Да все что угодно, в том то и дело :) Сжимать кэш, ждать отключения клиентов, и т.д.
А если под стартом/остановкой вы имели в виду просто отключение от терминала, форк в фон и прочие мелочи, то я не вижу в этом никаких подводных камней. Есть ли они?
В том, что зачастую серверу необходимо инициализировать и финализировать разнообразные и разнородные ресурсы. Это в свою очередь может накладывать определенные ограничения на процессы запуска/остановки.
Все это во многом зависит от задач, накладываемых на сервер, поэтому и волшебной таблетки нет. Хотя я как-то и не сталкивался с особыми проблемами при старте/остановке.
Простота разработки приходит только после определенного опыта, потому что фреймворк все-таки оправдывает свое название :)
А архитектурно и по производительности он меня целиком устраивает, когда привыкнешь к идеологии становится очень комфортно с ним работать.
На твистеде я пишу в настоящее время довольно замудренный REST-сервис, впечатления исключительно положительные. Можно сказать, что он меня и натолкнул на мысль написания этого маленького сервиса. Только здесь я решил воспользоваться возможностями, встроенными в язык, без лишних усложнений.
Действительно, проверил на 2.6 версии — такая же ошибка. Получилось исправить добавив пустой метод handle_close(self): pass. В версии 2.5 у меня вызывается handle_expt при такой ошибке, а до handle_close дело не доходит. Вероятно, разработчики что-то пересмотрели.
Это да. Работы там хватает. Я так думаю сейчас можно поработать месяцок, набраться силы и поднимать восстание. Насколько я понимаю прилично народа в Уральском регионе зарегистрировалось :)
Появилась еще мысль о том, что стремление жить и размножаться появилось так же, как и способность показывать точное время. То есть, если предположить что были часы, которые не хотели жить, а были часы с мутациями, у которых появилась так сказать тяга к жизни. В результате, разумеется, часы, которые жить не хотели погибли, а остались только те, которые хотели.
Для удобства определены методы модуля attr_reader и attr_writer, которые создают методы для чтения и записи указанных атрибутов. Также существует метод attr_accessor, который создает и reader-, и writer-метод.
По соглашению имя геттера и сеттера (ридера и врайтера) атрибута "@attribute" будут называться attribute и attribute= соответственно.
Исходя из этого имеем:
self.foo
— вызов метода, который может являться геттером атрибута@foo
foo
— вызов метода, который может являться геттером атрибута@foo
@foo
— чтение атрибута (переменной экземпляра)В статье утверждается, что
self.foo
необходимо использовать при присвоении. Это так, потому чтоfoo = 5
это создание и присвоение локальной переменной. Аself.foo = 5
это вызов writer-методаfoo=(5)
.К сожалению пока не успел догнать вас, нахожусь лишь на третьем шаге. Имеется голова с диффузной текстурой. Сейчас по-моему удалось избавиться от артефактов, которые по всей видимости возникают из-за арифметики с плавающими числами. Т.к. раст не позволяет автоматически конвертировать
числовыетипы, то чтобы не приводить числа по десять раз туда-сюда в каждой строчке я передаю в функцию triangle векторы с дробными координатами и оперирую ими до самого вывода пикселя. К тому же треугольник я отрисовываю не горизонтальными полосками, а вертикальными. В результате мое изображение немного отличается от вашего, приведенного в третьей статье. Например, есть достаточно заметное отличие на веке левого глаза.Код выложен на гитхабе, может быть кому-то еще будет интересно. Или опытные «растаманы» подскажут мне, что можно улучшить :)
По поводу вашего примера. Если ввести оператор is для определения перменных, то необходимо запретить идентификаторам содержать подстроку «is». Иначе полчим, что
Connection is ready is Boolean
— весьма неоднозначная конструкция.inta;
илиstaticpublicfunctionfunc();
Применительно к примеру из статьи:
Это переменная «Возраст ученика» типа «целый» или переменная «ученика» типа «целый Возраст»?
Ну и вдогонку:
На основании чего первый раз «Имя» это часть строки, а второй раз — переменная, которая должна быть заменена своим значением?
А если под стартом/остановкой вы имели в виду просто отключение от терминала, форк в фон и прочие мелочи, то я не вижу в этом никаких подводных камней. Есть ли они?
А архитектурно и по производительности он меня целиком устраивает, когда привыкнешь к идеологии становится очень комфортно с ним работать.
Или что вы понимаете под «диспетчиньем»?
Наверное, как-то так.