есть несколько параметров командной строки. Иногда желательно протестировать rake-файл, не выполняя никаких (потенциально опасных) операций; для этого служит флаг
– n
или
– -dry-run
. Флаг
– T
выводит список всех целей в rake-файле. Имеются также флаги, управляющие поиском библиотек, трассировкой, протоколированием и т.д.
Программа Rake сложнее, чем я описал в этом разделе (особенно это касается правил). И она продолжает развиваться. Как обычно, самую свежую информацию ищите в онлайновой документации .
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
;
• путь, указанный в переменной окружения
$irbrc
.
Инициализационные файлы пишутся на Ruby. В них можно настраивать текст приглашения и многое другое. Подробно эти файлы обсуждаются в книге «Programming Ruby». Ниже мы сделаем лишь несколько замечаний.
Если ваша версия Ruby собрана с поддержкой библиотеки GNU readline (обычно так и есть), то вы можете перемещаться по истории команд с помощью клавиш со стрелками вверх и вниз. Еще важнее, что работает механизм завершения по клавише Tab: когда вы набираете начало идентификатора, а затем нажимаете Tab,
irb
пытается дописать имя идентификатора за вас.
Чтобы включить механизм завершения, добавьте в файл