Проблема среды Ruby / IRB в MacOSX - PullRequest
2 голосов
/ 24 января 2011

У меня есть скрипт ruby, который не работает из-за моей среды, я думаю, что это демонстрируется странным поведением в irb (я также использую rvm, но не думаю, что это проблема)

>> ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin9.8.0]
>> irb
>> FileUtils.mkdir_p('tmp')
    NameError: uninitialized constant FileUtils
        from (irb):1
>> help
    => nil
>> FileUtils.mkdir_p('tmp')
     => "tmp" 

Команда FileUtils изначально терпит неудачу, но затем, после ввода справки (которая также не выполняется), похоже, работает.

Я пытался установить 'rubygems' и 'FileUtils', что решает проблему, но хотел бы понять, что здесь происходит.

Ответы [ 2 ]

1 голос
/ 24 января 2011

Вам нужно require 'fileutils':

require 'fileutils'
FileUtils.pwd # => "/"

Он не включен интерпретатором по умолчанию, поэтому IRB не загружает его предварительно. Поскольку IRB является интерактивным, он должен выполнять на лету некоторые вещи, которые не будет выполнять переводчик, например загружать файлы справки. То, что он делает это в ответ на ваш запрос, не является для меня чем-то неожиданным, это просто то, для чего он был запрограммирован. Я уверен, что если вы посмотрите на его код, вы сможете отследить его достаточно легко.

Итак, в основном, все, что вы видите, это то, что IRB правильно реагирует на синтаксическую ошибку, затем делайте то, что было сказано, в ответ на вашу команду "help".

Если вам абсолютно необходимо знать, что он делает, вы можете выяснить это, попросив IRB отследить его обработку:

echo help | irb -f --trace > irb.out

будет генерировать трассировку того, что делает IRB, когда вводится «помощь». Поиск по файлу показывает:

#0:/Users/greg/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/rdoc/ri/store.rb:2::-: require 'fileutils'

требуется store.rb, поскольку IRB загружает 'ri'.

FileUtils является частью стандартной библиотеки Ruby, поэтому он связан с интерпретатором, но не включается автоматически при запуске интерпретатора, как Dir и File. Он полностью автономен, не является частью Dir.

1 голос
/ 24 января 2011

Я не знал, что была команда «help», но, очевидно, она зависит от FileUtils, возможно, для загрузки файлов справки.«help» загружает свои требования в сеанс IRB.

>> before = ObjectSpace.each_object.map { |i| i.class }.uniq
=> [Regexp, String, Array, Class, Hash, Module, Proc, MatchData, File, Binding, NoMemoryError, Float, SystemStackError, fatal, Bignum, Object, IO, Thread, ThreadGroup, IRB::Locale, IRB::Notifier::LeveledNotifier, IRB::Notifier::CompositeNotifier, IRB::StdioOutputMethod, IRB::Notifier::NoMsgNotifier, Enumerable::Enumerator, RubyToken::TkNL, RubyToken::TkEND, RubyToken::TkBITOR, RubyToken::TkIDENTIFIER, RubyToken::TkDOT, RubyToken::TkRBRACE, RubyToken::TkSPACE, RubyToken::TkfLBRACE, RubyToken::TkCONSTANT, RubyToken::TkASSIGN, IRB::SLex::Node, IRB::SLex, RubyLex, IRB::ReadlineInputMethod, IRB::WorkSpace, IRB::Context, IRB::Irb]
>> help
=> nil
>> after  = ObjectSpace.each_object.map { |i| i.class }.uniq
=> [Regexp, String, MatchData, Array, Class, RI::ClassEntry, RI::MethodEntry, Hash, Module, Dir, Proc, File, Binding, NoMemoryError, Float, SystemStackError, fatal, Bignum, Object, IO, Thread, ThreadGroup, IRB::Locale, Range, IRB::Notifier::LeveledNotifier, IRB::Notifier::CompositeNotifier, IRB::StdioOutputMethod, IRB::Notifier::NoMsgNotifier, YAML::Syck::Resolver, Gem::ConfigFile, RubyToken::TkNL, RubyToken::TkIDENTIFIER, IRB::SLex::Node, IRB::SLex, RubyLex, IRB::ReadlineInputMethod, IRB::WorkSpace, IRB::Context, IRB::Irb, RI::TopLevelEntry, RI::RiReader, GetoptLong, RI::RiCache, RI::Options, RiDriver, Rational, Date::Infinity, Enumerable::Enumerator, RubyToken::TkRBRACE, DefaultDisplay, RI::TextFormatter]
>> after == before
=> false
>> after - before
=> [RI::ClassEntry, RI::MethodEntry, Dir, Range, YAML::Syck::Resolver, Gem::ConfigFile, RI::TopLevelEntry, RI::RiReader, GetoptLong, RI::RiCache, RI::Options, RiDriver, Rational, Date::Infinity, DefaultDisplay, RI::TextFormatter]

Загружает классы в after - before.Где FileUtils вы говорите?Я думаю, это модуль, который является частью Dir, но я не на 100% в этом.

...