1000000.times do
number = number + 1
end
end
7526 цифр
25000 удваиваний: 0.304966 сек. сосчитать до миллиона: 0.615216 сек.
Как просто! Как элегантно! Теперь с помощью этого крошечного метода я легко могу измерить время работы любой секции в любой программе, в какой только захочу: я просто закину код в блок и отправлю его методу profile. Что может быть проще? В большинстве языков мне понадобилось бы явно добавлять код для измерения времени (тот, что написан в profile) до и после каждой секции, которую я хотел бы захронометрировать. В то время как в Ruby я всё держу в одном-единственном месте и (что более важно) отдельно от всего остального!
Попробуйте ещё кое-что
• Дедушкины часы. Напишите метод, который принимает блок и вызывает его один раз для каждого часа, который прошёл сегодня. Таким образом, если я бы передал ему блок do puts 'БОМ! ' end, он бы отбивал время (почти) как дедушкины часы. Проверьте ваш метод с несколькими различными блоками (включая тот, что я вам дал). Подсказка: Вы можете использовать Time.now.hour, чтобы получить текущий час. Однако, он возвращает число между 0 и 23, поэтому вам придётся изменить эти числа, чтобы получить обычные числа, как на циферблате (от 1 до 12).
• Протоколирование программ. Напишите метод под названием log, который принимает строку описания блока и, конечно, сам блок. Подобно методу doSelfimportantly, он должен выводить с помощью puts строку, сообщающую, что он начал выполнение блока, и ещё одну строку в конце, сообщающую, что он закончил выполнение блока, а также сообщающую вам, что вернул блок. Проверьте ваш метод, отправив ему блок кода. Внутри этого блока поместите другой вызов метода log, передав ему другой блок. (Это называется вложенностью.) Другими словами, ваш вывод должен выглядеть примерно так:
Начинаю «внешний блок»…
Начинаю «другой небольшой блок»…
…«другой небольшой блок» закончен,
вернул: 5
Начинаю «ещё один блок»…
…«ещё один блок» закончен, вернул:
Мне нравится тайская еда!
…«внешний блок» закончен, вернул:
false
• Улучшенное протоколирование. Вывод из предыдущего метода log было трудновато читать, и было бы тем хуже, чем больше была бы вложенность. Было бы гораздо легче читать, если бы он делал отступы в строках для внутренних блоков. Чтобы это сделать, вам понадобится проверять, насколько глубоко вложен вызов
метода перед тем, как log хочет что-нибудь напечатать. Чтобы сделать это, примените глобальную переменную, т. е. переменную, которую вы можете видеть из любого места вашего кода. Чтобы сделать переменную глобальной, просто поставьте перед именем вашей переменной символ $, вот так: $global, $nestingDepth и $bigTopPeeWee. В конце концов, ваша программа протоколирования должна выводить примерно вот что:
Начинаю «внешний блок»…
Начинаю «другой небольшой блок»…
Начинаю «маленький-премаленький блок»…
…«маленький-премаленький блок» закончен,
вернул:
море любви
…«другой небольшой блок» закончен, вернул:
42
Начинаю «ещё один блок»…
…«ещё один блок» закончен, вернул: Я люблю
индийскую еду!
…«внешний блок» закончен, вернул: true
Ну вот почти и всё, что вы намеревались узнать из этого учебника. Мои поздравления! Вы изучили очень много! Возможно, вам не кажется, что вы помните всё, или же вы пропустили некоторые части… Ну и ладно, это нормально. Программирование – это не то, что вы знаете; это то, что вы можете вычислить. Покуда вы знаете, где найти то, что вы позабыли, у вас будет всё в порядке. Надеюсь, вы не думаете, что я написал всё это, не заглядывая куда-нибудь время от времени? Я именно так и делал. Мне также много помогали с кодом, выполняющим все примеры в этом учебнике. Но куда же я заглядывал и кого я просил о помощи? Давайте, я покажу вам…
11. Что не вошло в учебник
Итак, куда мы сейчас отправимся? Кого можно спросить, если у вас возник вопрос? А если вы хотите, чтобы ваша программа открывала web–страничку, отправляла электронную почту или масштабировала цифровое изображение? Что ж, есть полным- полно мест, где найдется помощь по Ruby. Но, к сожалению, такой ответ вам не слишком поможет, не так ли? :-)
Что касается меня, то на самом деле есть только три места, где я ищу помощи по Ruby. Если это небольшой вопрос, и я полагаю, что я могу сам поэкспериментировать, чтобы найти на него ответ, то я использую irb. Если это вопрос посерьёзнее, я обращаюсь к своей киркомотыге. А если я никак не могу разобраться с ним сам, то я прошу помощи в ruby–talk.
Если вы установили Ruby, то вы также установили irb. Чтобы его запустить, нужно просто перейти в командное окно и напечатать irb. Когда вы находитесь в сеансе irb, вы можете вводить любые выражения языка Ruby, какие пожелаете, а он будет выдавать вам их значения. Введите 1 + 2, и он выдаст вам 3. (Обратите внимание, что вам не нужно использовать puts.) Это похоже на гигантский калькулятор на Ruby. Когда вы закончите, просто введите команду exit.
В irb имеется гораздо больше этого, но обо всём этом вы можете узнать в «киркомотыге».
Абсолютно именно та книга по Ruby, которая нужна всем – это «Программирование на Ruby: Руководство прагматичного программиста», написанная Дэвидом Томасом и Эндрю Хантом <a href="http://www.pragmaticprogrammer.com/"> (Программисты-прагматики). Хотя я очень рекомендую достать<a href="http://www.pragmaticprogrammer.com/titles/ruby/"> 2-е <a href="http://www.pragmaticprogrammer.com/titles/ruby/"> издание этой замечательной книги, где освещены все последние возможности Ruby, вы также можете взять немного более старую (но до сих пор в основном подходящую) версию, бесплатно доступную<a href="http://www.rubycentral.com/book/"> в Сети. (На самом деле, если вы установили версию Ruby для Windows, то она у вас уже имеется.)
В этой книге вы можете найти о руби Ruby почти всё, от основ до самых передовых возможностей. Она легко читается; она исчерпывающая; она почти безупречна. Хотелось бы, чтобы для всякого языка имелась бы книга подобного качества. В конце книги вы найдёте огромный раздел, где подробно описан каждый метод каждого класса, приведены объяснения и примеры. Я просто полюбил эту книгу!
Её можно найти в нескольких местах (включая собственный сайт <a href="http://www.pragmaticprogrammer.com/"> Программистов- <a href="http://www.pragmaticprogrammer.com/">прагматиков), но мне больше всего нравится сайт<a href="http://www.ruby-doc.org/docs/ProgrammingRuby/"> ruby–doc.org. В этой версии слева имеется симпатичное оглавление, а также предметный указатель. (На <a href="http://www.ruby-doc.org/"> ruby–doc.org
есть также много другой документации, например, о базовом API и стандартной библиотеке… В основном, там есть готовые к использованию документы обо всём, что касается Ruby.<a href="http://www.ruby-doc.org/"> Проверьте сами.)
А почему же она называется «киркомотыга» («the pickaxe»)? Ну, там на обложке книги есть картинка киркомотыги. Мне кажется, это глупое название, но оно уже «прилипло».
Даже имея irb и киркомотыгу, вы иногда всё-таки не можете разобраться с чем- нибудь. Или, возможно, вы хотите знать, не делал ли уже кто-нибудь то, над чем вы сейчас работаете, чтобы выяснить, можно ли вам этим воспользоваться. В этих случаях вам нужно обратиться именно в<a href="mailto:ruby-talk@ruby-lang.org"> ruby–talk, список рассылки о Ruby. В нём полно дружелюбных, умных, отзывчивых людей. Чтобы побольше узнать о нём или подписаться на него, взгляните<a href="http://www.ruby-lang.org/en/20020104.html"> сюда.