Программирование на языке Ruby - [232]

Шрифт
Интервал

>end

Тут мы наблюдаем небольшое волшебство. Rake устанавливает атрибут >source, подставляя расширение имени файла из хэша (в данном случае >.o заменяется на >.c).

Продолжим сеанс магии. Если затребовать библиотеку >rake/clean, то появляются константы >clean и >clobber (первоначально пустые) и задания >:clean и >:clobber. По сложившейся традиции >clean удаляет временные файлы, a >clobber — еще и собранный исполняемый файл.

Для этих напоминающих массив констант определен метод >include, принимающий маску имени файлов; это неявное использование механизма >FileList.

Теперь наш rake-файл принимает такой вид:

>require 'rake/clean'


>CLEAN.include("*.о")

>CLOBBER.include("myprog")


>SRC = FileList['*.с']

>OBJ = SRC.ext('o')


>rule '.o' => '.c' do |t|

> sh "cc -с -o #{t.name} #{t.source}"

>end


>file "hello" => OBJ do

> sh "cc -o hello #{OBJ}"

>end


>file "myprog.o" => ["myprog.c"]

>file "sub1.o" => ["sub1.c", "sub1.h"]

>file "sub2.o" => ["sub2.c", "sub2.h"]


>task :default => ["myprog"]

Обратите внимание, что мы не задавали задания «clean» и «clobber» явно. Кроме того, отметим что «clobber» неявно включает операцию «clean». И наконец, мы определили задание >default для удобства запуска rake-файла; теперь можно не указывать явно имя задания, осуществляющего компиляцию и сборку.

У программы >rake есть несколько параметров командной строки. Иногда желательно протестировать rake-файл, не выполняя никаких (потенциально опасных) операций; для этого служит флаг >-n или >--dry-run. Флаг >-T выводит список всех целей в rake-файле. Имеются также флаги, управляющие поиском библиотек, трассировкой, протоколированием и т.д.

Программа Rake сложнее, чем я описал в этом разделе (особенно это касается правил). И она продолжает развиваться. Как обычно, самую свежую информацию ищите в онлайновой документации (http://docs.rubyrake.org/).

21.3. Оболочка irb

Утилита >irb (интерактивный Ruby) уже много лет как включена в дистрибутив Ruby. Можно считать, что это «испытательный стенд» или «площадка для игр», на которой вы опробуете новые приемы и идеи.

Работать с >irb просто. После запуска вы получаете приглашение и можете вводить произвольные выражения Ruby. Выражение вычисляется, и печатается результат. Вот пример короткого сеанса:

>$ irb

>irb(main):001:0> "cell" + "о"

>=> "cello"

>irb(main):002:0> 3*79

>=> 237

>irb(main):003:0> Dir.entries(".").size

>=> 17

>irb(main):004:0> rand

>=> 0.850757389880155

>irb(main):005:0> rand

>=> 0.679879756672551

>irb(main):006:0> defined? Foo

>=> nil

>irb(main):007:0> defined? Object

>=> "constant"

>irb(main):008:0> quit

>$

Конечно, это больше, чем калькулятор. При желании можно ввести произвольный код на Ruby:

>[hal@localhost ch21]$ irb

>irb(main):001:0> require 'mathn'

>=> true

>irb(main):002:0> gen = Prime.new

>=> #

При установке флага >-r выполняется require, поэтому можно включать код из внешнего файла. Предположим, что вы написали такой файл:

># File: foo.rb

>class MyClass


> attr_accessor :alpha, :beta


> def initialize(a, b)

>  @alpha, @beta = a, b

> end


>end


>obj1 = MyClass.new(23,34)

>obj2 = MyClass.new("abc","xyz")

Тогда можно сделать следующее:

>$ irb -rfoo

>irb(main):001:0> obj = MyClass.new(88,99)

>=> #

Отметим, что хотя обращаться к сущностям, определенным в файле (например, к константе >MyClass) мы можем, это не относится к локальным переменным. Локальные переменные доступны только в самом файле, >require (выполненное хоть внутри, хоть вне >irb) доступа к ним не дает.

Новичков часто смущает информация, выводимая >irb:

>$ irb -rfoo

>irb(main):001:0> puts "hello"

>hello

>=> nil

Позвольте, что тут делает >nil? Разумеется, это значение, возвращенное методом >puts.

Еще один источник недоразумений — метод >eval. Взгляните на следующий сеанс:

>$ irb

>irb (main) : 001:0> eval("var = 567")

>=> 567

>irb(main) :002:0> eval("var")

>=> 567

>irb(main):003:0> var

>=> 567

Вас ничего не удивляет? Но давайте запустим следующий сценарий и посмотрим, что произойдет:

>р eval("var = 567")

>р eval("var")

>р var


># Results:

># 567

># 567

># temp.rb:3: undefined local variable or method 'var' for main:Object

># (NameError)

У Ruby есть такая особенность: когда вы выполняете >eval, а вслед за ним еще один, они в некотором смысле разделяют «общую область видимости». Поэтому к переменной, определенной в первой строке, можно обратиться во второй (вне или внутри >irb). Но различие проявляется, когда мы попытаемся обратиться к той же переменной без использования >eval. В >irb это работает, а в сценарии мы получаем ошибку. Что происходит?

Поведение сценария следует считать более правильным. Не забывайте, что сама программа >irb написана на Ruby; здравый смысл подсказывает, что она, скорее всего, внутри вызывает >eval. Но мы только что убедились, что результат применения >eval может отличаться от того, что мы видим на верхнем уровне, поэтому исполнение кода внутри >irb не всегда идентично исполнению такого же кода в сценарии. Об этом не следует забывать, особенно если вы ставите какие-нибудь экзотические эксперименты.

Имейте в виду, что >irb настраивается в широких пределах. При запуске она читает все инициализационные файлы, которые может найти, в следующем порядке:

• файл >~/.irbrc;

• файл >.irbrc;

• файл >irb.rс;

• файл >_irbrc


Рекомендуем почитать
Графика DirectX в Delphi

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


Вторая жизнь старых компьютеров

Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


DirectX 8. Начинаем работу с DirectX Graphics

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.