Ruby中的绑定。什么是思考它们的好方法。它们包含什么?

时间:2014-11-10 22:59:37

标签: ruby binding

我对绑定感到困惑。

def repl(input_stream, output_stream)
  loop do
    output_stream.print "> "
    input  = input_stream.gets()
    result = binding.eval(input)
    output_stream.puts(result)
  end
end

repl($stdin, $stdout)

我打算用$ stdin和$ stdout调用repl。我需要一个愚蠢的版本:

binding.eval(input) is doing.

绑定只是我们目前在调用堆栈中的位置吗?他们持有当前的局部变量?还要别的吗?什么是与现有范围不同的好方法?

1 个答案:

答案 0 :(得分:0)

Binding类的对象将执行上下文封装在代码中的某个特定位置,并保留此上下文以供将来使用。可以在此上下文中访问的变量,方法,self值以及可能的迭代器块都将被保留。可以使用Kernel#binding创建绑定对象,并使其可用于Kernel#set_trace_func的回调。

               static VALUE
bind_local_variable_defined_p(VALUE bindval, VALUE sym)
{
    ID lid = check_local_id(bindval, &sym);
    const rb_binding_t *bind;

    if (!lid) return Qfalse;

    GetBindingPtr(bindval, bind);
    return get_local_variable_ptr(bind->env, lid) ? Qtrue : Qfalse;
}

以下是公共实例方法的示例

def get_binding(param)
  return binding
end
b = get_binding("hello")
b.eval("param")   #=> "hello"