ноября 18, 2012 | Published in Best Practices, Уголок философа
Не раз ко мне обращались с какими-то вопросами, вроде помоги найти ошибку или что-то вроде того, когда я находил в годе копрокод, точнее, когда я находил, что весь код в целом — копрокод, то мне в лицо бросались ссылкой на ставшую популярной книгу Майкла Хартла. Последний такой случай сподвиг меня на написание этой философской статьи, которую многие по праву могут назвать водой, а автора которой мудаком, который должен облить себя бензином и поджечь.
Собственно из-за того бросания в меня ссылками на Хартла и родилось это название <irony>Майкл Хартл — самый ужасный программист в мире!</irony>. Я надеюсь, что использование тега <irony></irony> спасет меня от «Ты сам мудак! Хартл — няша!» ибо, как показывает практика, людей обидчивых и не понимающих иронию очень много. К Майклу Хартлу я отношусь очень хорошо, он написал хорошую книгу, которую я рекомендовал бы к прочтению всем и хотя у меня есть несколько мелких разногласий с автором, я все же считаю его отличным программистом, а его книгу обязательной для прочтения. Read the rest of this entry »
ноября 15, 2012 | Published in Best Practices
Вы должно быть знаете о культе карго (cargo cult)? Если нет — в Википедии есть . Культом карго также стало модно называть любое подражание без понимания сути. Члены культа карго подражают человеку или группе людей, которые добились успеха в чем-либо, рассчитывая на то, чтобы добиться аналогичных результатов от своего повторения.
Разумеется, подражание не есть плохо, но когда это глупое подражание, подражание без понимания сути, тогда это подражание становится глупостью и может сыграть с подражающим злую шутку. Почему? — Потому, что любое следования заповедям — это глупость. Поведение должно быть ситуативным и осмысленным, а не основываться на каких-либо догмах.
Если спросить — Чем тушить пожар? — Большинство не задумываясь ответят — Водой. На самом же деле не всякий пожар можно тушить водой. Например, нельзя тушить водой электротехнику, нельзя потушить водой горючие жидкости, например, бензин или керосин и т.д. Водой также нельзя тушить воспламенившиеся щелочные металлы и много-много чего прочего.
Read the rest of this entry »
сентября 8, 2012 | Published in Ruby, Расширения, Уголок философа
Честно сказать, достали меня уже вопросом о том, что такое self. Особено странно, что некоторые люди начинают работать с Ruby on Rails не разобравшись с самим языком Ruby. Ну как так можно? А?! Если лень читать книгу на 600 страниц — есть статьи на RubyDev, они не полностью корректные так как я писал их достаточно давно, но в общем достаточно годные, как мне кажется. Если нет желания прочитать краткие статьи, которые я пытался написать более чем понятным новичку языком, то, я думаю, что программирование — это не ваше. Ну да ладно. Напишу отдельную статью о self, хотя то, что такое self много где упоминалось в статьях на RubyDev.
self — это ссылка на текущий объект.
У каждого метода должен быть приемник — на то он и метод, а не функция, а если приемник не указан, то подразумевается, что приемником является self.
Read the rest of this entry »
сентября 5, 2012 | Published in Ruby Gems, Tips&Tricks
Зачем?
Все мы знаем, что при установке gem’ов часто генерация документации занимает куда больше времени, чем сама установка gem’а, при этом никто не пользуется оффлайновой документацией. Зачем открывать новую вкладку и запускать gem server, если вся документация доступна онлайн? Если вы не пользуетесь оффлайн документацией, то зачем засорять ею жесткий диск и тратить время на ожидание ее генерации при установке gem’ов?
Для отключения генерации документации с командой gem install используют флаги —no-rdoc и —no-ri, например, так:
$ gem install rails —no-rdoc —no-ri
Однако есть вариант получше — использовать файл .gemrc в вашей home/ директории.
Просто добавьте в него следующую строку:
gem: —no-rdoc —no-ri
И вы забудете о генерации документации навсегда!
сентября 3, 2012 | Published in Ruby, Tips&Tricks
Недавно в статье о Переменных и константах в Ruby я упомянул о том, что из строки можно получить константу используя Kernel.const_get, на что получил в комментариях целых два замечания. Первое касалось того, что следует использовать Object.const_get, вместо Kernel.const_get, а второе касалось того, что нужно учитывать неймспейсы, а потому получение констант из строки несколько сложнее реализовать. Та статья была о другом, потому, я решил добавить отдельную статью в Tips & Tricks о том, как правильно получать из строки константу.
Код выполняющий это действие я решил поместить в метод #constantize, метод называется так же, как аналогичный метод в Rails, и создать для него псевдоним #to_const. Собственно вот его код:
class String
def constantize
constants = self.split("::")
main = Object.const_get(constants.shift)
constants.inject(main) { |full, nested| full = full.const_get(nested) }
end
alias :to_const :constantize
end
Пример работы:
module SuperExtensions
module MySuperExtension
class Extension
def self.hello
puts "Hello!"
end
end
end
end
klass = "SuperExtensions::MySuperExtension::Extension".to_const
klass #=> SuperExtensions::MySuperExtension::Extension
klass.hello # Hello!
Вот и все! Удачи!
сентября 1, 2012 | Published in Ruby, Основы
Честно говоря я не очень понимаю в чем возникает путаница с переменными в Ruby, однако мне уже не раз задавали вопросы типа: Что такое @-переменная? Что такое @@-переменная? А в чем их разница?
В этой статье я постараюсь рассказать обо всех типах переменных и константах языка Ruby, а на подобные вопросы буду давать ссылку на эту статью.
В Ruby существует 4 вида переменных и константы.
Read the rest of this entry »
июля 21, 2012 | Published in Ruby, Tips&Tricks, Расширения
Говорят, что расширение классов ядра (monkey-patching) — это зло. Тут еще некоторые ведут споры касательно того, что считать monkey-patching’ом — добавление новых методов или переопределение старых, но мы обойдем этот спор стороной и сконцентрируемся на том, как это делать безболезненно.
Read the rest of this entry »
июля 21, 2012 | Published in Ruby, Tips&Tricks
Вам наверное знаком такой код:
a ||= []
a << elem
Так вот, вместо нее можно использовать:
a = [1,2,3,4,5]
b = nil
a = Array.new([*a, 6])
b = Array.new([*b, 1])
a # => [1, 2, 3, 4, 5, 6]
b # => [1]
UPD Предложение от Михаила Дитерле в комментариях:
a = [*a, 6]
b = [*b, 1]
июля 21, 2012 | Published in Ruby, Ruby Gems, Tips&Tricks, Расширения
Часто необходимо пользователям gem’ов позволить настраивать их на свой вкус. Как это сделать — об этом эта маленькая статья.
Добавление возможности конфигурирования делается очень просто, наиболее часто для этого используется специальный класс, но если конфигурация совсем простая, то можно обойтись Struct или хэшем. В примере ниже приведена реализация на основе класса Config, однако ее легко можно модифицировать так, чтобы использовался Struct или хэш. Очевидно, что вариант с классом конфигурации наиболее гибкий, а вариант с хэшем наиболее простой.
Read the rest of this entry »
июля 21, 2012 | Published in Ruby, Основы
Давайте выделим несколько наиболее выразительных групп методов:
- Методы проверки, они возвращают true или false (методы — предикаты).
- Методы копирующие объект и возвращающие его копию предварительно выполнив на ней определенные действия.
- Методы преобразования, они изменяют объект для которого применяются (bang!-методы, методы — мутаторы).
- Методы основной смысл которых — что-то передать, (я их называю методы — ссылки, к ним относятся, например аксессоры) (методы доступа).
- Методы, которые устанавливают значения свойств/переменных (setter’ы)
Чтобы было понятнее о чем я, представляю примеры всех 4 типов методов:
1. Методы проверки (предикаты)
[1, 2, 3].empty? # => false
nil.nil? # => true
Read the rest of this entry »