2011-01-20 18 views
11

因爲:如果我未指定<programfile>,如何將<arguments>傳遞給IRB?

irb --help 

用法:irb.rb [選項] [programfile] [參數]


我知道我可以傳遞參數ARGV如果我包括programfile

例如:

irb test.rb A B C 

其中test.irb是簡單地 「P ARGV」

生產:

[ 「一」, 「B」, 「C」]


製作programfileCON在DOS ...我可以做以下

irb con A B C 
con(main):001:0> ARGV 

生產:

ARGV
=> [ 「A」, 「B」, 「C」]

但是這是依賴於系統的,並且具有呼應輸入的:-(

副作用我真正喜歡的東西像

irb -- a b c 

BTW:我知道我可以設置ARGV內IRB但我我的意圖是別名特殊== IRB -rSpecialLibrary」這樣我就可以這樣做:

special A B C 
<input goes here> 

有什麼建議嗎?

+0

這是一個格式嚴重的系列示例代碼和示例。請使用[編輯幫助](http://stackoverflow.com/editing-help)中提供的示例嘗試重新編輯和格式化。通常我會幫你清理它,但是太多了,我不知道你的意圖。 – 2011-01-20 19:46:09

+0

爲什麼你想傳遞參數,如果你可以設置他們在irb? SpecialLibrary是否使用了參數? – cldwalker 2011-01-21 02:31:19

+0

我想別名 「special == irb -rSpecialLibrary」 所以我可以像上面所說的那樣做「特殊的A B C」。 – DMisener 2011-01-21 16:02:22

回答

0

很奇怪的解決方案是創建一個變量

# defaults.rb 
@a = "hello world" 

而且

# terminal 
=> irb -r defaults.rb 
irb=> @a 
irb=> "hello world" 
8

縱觀irb可執行文件的源文件:

#!/usr/bin/env ruby 
require "irb" 

if __FILE__ == $0 
    IRB.start(__FILE__) 
else 
    # check -e option 
    if /^-e$/ =~ $0 
    IRB.start(__FILE__) 
    else 
    IRB.setup(__FILE__) 
    end 
end 

AT的源IRB模塊:

# File lib/irb/init.rb, line 15 
    def IRB.setup(ap_path) 
    IRB.init_config(ap_path) 
    IRB.init_error 
    IRB.parse_opts 
    IRB.run_config 
    IRB.load_modules 

    unless @CONF[:PROMPT][@CONF[:PROMPT_MODE]] 
     IRB.fail(UndefinedPromptMode, @CONF[:PROMPT_MODE]) 
    end 
    end 

下到parse_opts,我們的問題的方法:

# File lib/irb/init.rb, line 126 
    def IRB.parse_opts 
    load_path = [] 
    while opt = ARGV.shift 
     case opt 
     when "-f" 
     @CONF[:RC] = false 
     when "-m" 
     @CONF[:MATH_MODE] = true 
     when "-d" 
     $DEBUG = true 
     when /^-r(.+)?/ 
     opt = $1 || ARGV.shift 
     @CONF[:LOAD_MODULES].push opt if opt 
     when /^-I(.+)?/ 
     opt = $1 || ARGV.shift 
     load_path.concat(opt.split(File::PATH_SEPARATOR)) if opt 
     when '-U' 
     set_encoding("UTF-8", "UTF-8") 
     when /^-E(.+)?/, /^--encoding(?:=(.+))?/ 
     opt = $1 || ARGV.shift 
     set_encoding(*opt.split(':', 2)) 
     when "--inspect" 
     @CONF[:INSPECT_MODE] = true 
     when "--noinspect" 
     @CONF[:INSPECT_MODE] = false 
     when "--readline" 
     @CONF[:USE_READLINE] = true 
     when "--noreadline" 
     @CONF[:USE_READLINE] = false 
     when "--echo" 
     @CONF[:ECHO] = true 
     when "--noecho" 
     @CONF[:ECHO] = false 
     when "--verbose" 
     @CONF[:VERBOSE] = true 
     when "--noverbose" 
     @CONF[:VERBOSE] = false 
     when /^--prompt-mode(?:=(.+))?/, /^--prompt(?:=(.+))?/ 
     opt = $1 || ARGV.shift 
     prompt_mode = opt.upcase.tr("-", "_").intern 
     @CONF[:PROMPT_MODE] = prompt_mode 
     when "--noprompt" 
     @CONF[:PROMPT_MODE] = :NULL 
     when "--inf-ruby-mode" 
     @CONF[:PROMPT_MODE] = :INF_RUBY 
     when "--sample-book-mode", "--simple-prompt" 
     @CONF[:PROMPT_MODE] = :SIMPLE 
     when "--tracer" 
     @CONF[:USE_TRACER] = true 
     when /^--back-trace-limit(?:=(.+))?/ 
     @CONF[:BACK_TRACE_LIMIT] = ($1 || ARGV.shift).to_i 
     when /^--context-mode(?:=(.+))?/ 
     @CONF[:CONTEXT_MODE] = ($1 || ARGV.shift).to_i 
     when "--single-irb" 
     @CONF[:SINGLE_IRB] = true 
     when /^--irb_debug=(?:=(.+))?/ 
     @CONF[:DEBUG_LEVEL] = ($1 || ARGV.shift).to_i 
     when "-v", "--version" 
     print IRB.version, "\n" 
     exit 0 
     when "-h", "--help" 
     require "irb/help" 
     IRB.print_usage 
     exit 0 
     when "--" 
     if opt = ARGV.shfit 
      @CONF[:SCRIPT] = opt 
      $0 = opt 
     end 
     break 
     when /^-/ 
     IRB.fail UnrecognizedSwitch, opt 
     else 
     @CONF[:SCRIPT] = opt 
     $0 = opt 
     break 
     end 
    end 
    if RUBY_VERSION >= FEATURE_IOPT_CHANGE_VERSION 
     load_path.collect! do |path| 
     /\A\.\// =~ path ? path : File.expand_path(path) 
     end 
    end 
    $LOAD_PATH.unshift(*load_path) 

    end 

它是硬編碼把該選項爲腳本的名稱(@CONF [:SCRIPT] = OPT)。幸運的是,這是Ruby。我的第一個想法是使用不同的腳本啓動IRB,首先修改模塊。

〜/斌/定製IRB:

#!/usr/bin/env ruby 
require 'irb' 
module IRB 
    class << self 
    # sort of lame way to reset the parts we don't like about 
    # parse_opts after it does the parts we do like 
    def parse_opts_with_ignoring_script 
     arg = ARGV.first 
     script = $0 
     parse_opts_without_ignoring_script 
     @CONF[:SCRIPT] = nil 
     $0 = script 
     ARGV.unshift arg 
    end 
    alias_method :parse_opts_without_ignoring_script, :parse_opts 
    alias_method :parse_opts, :parse_opts_with_ignoring_script 
    end 
end 

if __FILE__ == $0 
    IRB.start(__FILE__) 
else 
    # check -e option 
    if /^-e$/ =~ $0 
    IRB.start(__FILE__) 
    else 
    IRB.setup(__FILE__) 
    end 
end 

您可以custom-irb foo bar baz推出這種和argv將['foo', 'bar', 'baz']

0

您可以製作一個修改ARGV的文件,然後使用'-r'來包含它。

$ echo 'ARGV = ["testing", "1","2","3"]' > ~/blah.rb && irb -r ./blah test.rb 
/home/me/blah.rb:1: warning: already initialized constant ARGV 
test.rb(main):001:0> require 'pp' 
=> true 
test.rb(main):002:0* pp ARGV 
["testing", "1", "2", "3"] 
=> ["testing", "1", "2", "3"] 
test.rb(main):003:0> 

你甚至可以將它重定向到你的〜/ .irbrc文件中,而忽略'-r ./blah'。

相關問題