ruby 如果< arguments>我没有说明,我如何传递给IRB< programfile>?

kxkpmulp  于 9个月前  发布在  Ruby
关注(0)|答案(5)|浏览(97)

自:

irb --help

字符串
用法:irb.rb [选项] [程序文件] [参数]
我知道如果我包含一个 programfile,我可以将参数传递给ARGV
例如:

irb test.rb A B C


其中test.irb只是“p ARGV”
生产:
[“a”、“B”、“c”]
在DOS下将 programfile 设为con.

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


生产:
ARGV
=> [“A”,“B”,“C”]
但这是系统相关的,并且具有回声输入的副作用:-(
我真正喜欢的是

irb -- a b c


顺便说一句:我知道我可以在irb中设置ARGV,但我的目的是别名special == irb -rSpecialLibrary”,所以我可以这样做:

special A B C
<input goes here>


有什么建议吗?

avwztpqn

avwztpqn1#

查看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

字符串
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[:CONT] = opt)。幸运的是,这是Ruby。我的第一个想法是使用不同的脚本来启动IRB,首先修改模块。
~/bin/custom-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']

91zkwejq

91zkwejq2#

As of 2022,现在有一个--noscript选项来实现这一目标。请参阅IRB文档以获得解释和示例用法,复制在这里:

$ irb --noscript Foo Bar Baz
irb(main):001> ARGV
=> ["Foo", "Bar", "Baz"]

字符串

2sbarzqh

2sbarzqh3#

方法一:使用Ruby的-e选项一种方法是使用Ruby命令和-e选项来执行一个小脚本,该脚本在设置ARGV后启动irb。这允许您传递参数,就像将参数传递给脚本一样。

ruby -e "ARGV.replace(['A', 'B', 'C']); require 'irb'; IRB.start"

字符串
此命令执行以下操作:
将ARGV设置为所需的参数。
需要irb库。
开始IRB会话。
你可以用你需要的任何参数来替换“A”,“B”,“C”]。

mpgws1up

mpgws1up4#

一个很奇怪的解决方案是创建一个带有变量的文件

# defaults.rb
@a = "hello world"

字符串

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

tmb3ates

tmb3ates5#

您可以创建一个修改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'。

相关问题