Программирование на языке 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
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.