【问题标题】:How can I create my own irb using binding?如何使用绑定创建自己的 irb?
【发布时间】:2019-07-29 21:55:26
【问题描述】:

试图编写一个通过命令行与用户交互通信的程序。 当我们与普通的 irb 交互时,我们可以给出块进行评估或留空。类似的东西:

irb(main):001:0> 1+2
#=> 3
irb(main):002:0> class Foo
irb(main):003:1>  def foo
irb(main):004:2>    print 1
irb(main):005:2>  end
irb(main):006:1> q
[2156][giles@nikola:~]$
#=> nil

在这个交互式 shell 上输入 'q' 后,我们应该能够退出 irb shell 以及整个程序。

我创建了一个程序来打开这个交互式会话,我们可以对程序的现有内容执行某些操作。就像我们可以改变 @var 的值一样 irb(main):001:0> @var = 'new' => 新的

但我想使用绑定来实现这一点,也不想在我的代码中使用“#require 'irb'”调用 irb 方法。

我的解决方案:

require 'irb'
class C
    def my_method
        @var = 'hi'
        $my_binding = binding
        IRB.start(__FILE__)
    end
end

C.new.my_method

预期结果:我想以类似的方式实现它 -

class Bind
  def get_binding(param)
    binding
  end
end

....

【问题讨论】:

  • 查看github.com/pry/pry,了解其他人如何做类似的工作。
  • 感谢@anothermh 指导我。但是我将不得不再次使用 require 'pry' 并尝试通过 binding.pry 打开交互式会话。我试图避免使用现有的库。
  • 我的意思是你应该看看 pry 看看他们是怎么做的。
  • 我明白你的意思。

标签: ruby binding irb


【解决方案1】:

我想我想要这样的东西(IRB 已创建,但仍无法评估语句):

class Demo
  def initialize(n)
    @secret = self.class.send(:define_method,n) { instance_eval"#{n}" }
  end
  def get_binding
    binding
  end
end

user_input = ''
k2 = Demo.new(user_input)
b2 = k2.get_binding

until user_input == 'q' do
  user_input = gets.chomp
  puts eval('@secret', b2)
end

【讨论】:

  • 像 x=1 这样的语句; y = 1 ;然后输入 x + y 应该在 irb 中获取结果,直到按下 q。
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多