类 IRB::JobManager

属性

current_job[RW]

当前活动的 irb 会话

公共类方法

new() 点击切换源代码

创建一个新的 JobManager 对象

# File lib/irb/ext/multi-irb.rb, line 11
def initialize
  @jobs = []
  @current_job = nil
end

公共实例方法

delete(key) 点击切换源代码

删除给定 key 处的作业。

# File lib/irb/ext/multi-irb.rb, line 115
def delete(key)
  case key
  when Integer
    fail NoSuchJob, key unless @jobs[key]
    @jobs[key] = nil
  else
    catch(:EXISTS) do
      @jobs.each_index do
        |i|
        if @jobs[i] and (@jobs[i][0] == key ||
            @jobs[i][1] == key ||
            @jobs[i][1].context.main.equal?(key))
          @jobs[i] = nil
          throw :EXISTS
        end
      end
      fail NoSuchJob, key
    end
  end
  until assoc = @jobs.pop; end unless @jobs.empty?
  @jobs.push assoc
end
insert(irb) 点击切换源代码

将给定的 irb 会话添加到作业 Array 中。

# File lib/irb/ext/multi-irb.rb, line 50
def insert(irb)
  @jobs.push [Thread.current, irb]
end
inspect() 点击切换源代码

输出作业列表,请参见 irb 命令 irb_jobsjobs

# File lib/irb/ext/multi-irb.rb, line 139
def inspect
  ary = []
  @jobs.each_index do
    |i|
    th, irb = @jobs[i]
    next if th.nil?

    if th.alive?
      if th.stop?
        t_status = "stop"
      else
        t_status = "running"
      end
    else
      t_status = "exited"
    end
    ary.push format("#%d->%s on %s (%s: %s)",
      i,
      irb.context.irb_name,
      irb.context.main,
      th,
      t_status)
  end
  ary.join("\n")
end
irb(key) 点击切换源代码

返回给定 key 对象的 irb 会话,请参见 search 获取更多信息。

# File lib/irb/ext/multi-irb.rb, line 34
def irb(key)
  _, irb = search(key)
  irb
end
kill(*keys) 点击切换源代码

终止由给定 keys 指定的 irb 会话。

如果给定的 keys 中的一个已经终止,则会引发 IrbAlreadyDead 异常。

请参见 Thread#exit 获取更多信息。

# File lib/irb/ext/multi-irb.rb, line 77
def kill(*keys)
  for key in keys
    th, _ = search(key)
    fail IrbAlreadyDead unless th.alive?
    th.exit
  end
end
main_irb() 点击切换源代码

返回顶层 irb 会话。

# File lib/irb/ext/multi-irb.rb, line 45
def main_irb
  @jobs[0][1]
end
main_thread() 点击切换源代码

返回顶层线程。

# File lib/irb/ext/multi-irb.rb, line 40
def main_thread
  @jobs[0][0]
end
n_jobs() 点击切换源代码

irb 会话的总数,用于设置当前 Contextirb_name

# File lib/irb/ext/multi-irb.rb, line 21
def n_jobs
  @jobs.size
end
switch(key) 点击切换源代码

将当前活动的irb会话更改为作业Array中给定的key

如果给定的key不再存活,则引发IrbAlreadyDead异常。

如果给定的irb会话已经处于活动状态,则会引发IrbSwitchedToCurrentThread异常。

# File lib/irb/ext/multi-irb.rb, line 61
def switch(key)
  th, irb = search(key)
  fail IrbAlreadyDead unless th.alive?
  fail IrbSwitchedToCurrentThread if th == Thread.current
  @current_job = irb
  th.run
  Thread.stop
  @current_job = irb(Thread.current)
end
thread(key) 点击切换源代码

返回给定key对象的线程,有关更多信息,请参见search

# File lib/irb/ext/multi-irb.rb, line 27
def thread(key)
  th, = search(key)
  th
end