Ruby 2.4

Binding

class Binding

Parent:Object

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

这些绑定对象可以作为方法的第二个参数传递Kernel#eval,为评估创建一个环境。

class Demo def initialize(n) @secret = n end def get_binding binding end end k1 = Demo.new(99) b1 = k1.get_binding k2 = Demo.new(-3) b2 = k2.get_binding eval("@secret", b1) #=> 99 eval("@secret", b2) #=> -3 eval("@secret") #=> nil

绑定对象没有类特定的方法。

公共实例方法

eval(string [, filename ,lineno]) → obj显示源文件

绑定的上下文中以字符串形式评估Ruby表达式。如果存在可选的文件名lineno参数,则会在报告语法错误时使用它们。

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

static VALUE bind_eval(int argc, VALUE *argv, VALUE bindval) { VALUE args[4]; rb_scan_args(argc, argv, "12", &args[0], &args[2], &args[3] args[1] = bindval; return rb_f_eval(argc+1, args, Qnil /* self will be searched in eval */ }

local_variable_defined?(符号)→obj显示源文件

如果一个局部变量symbol存在,返回true

def foo a = 1 binding.local_variable_defined?(:a) #=> true binding.local_variable_defined?(:b) #=> false end

此方法是以下代码的简短版本:

binding.eval("defined?(#{symbol}) == 'local-variable'")

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(VM_ENV_ENVVAL_PTR(vm_block_ep(&bind->block)), lid) ? Qtrue : Qfalse; }

local_variable_get(symbol)→obj显示源文件

返回局部变量的值symbol

def foo a = 1 binding.local_variable_get(:a) #=> 1 binding.local_variable_get(:b) #=> NameError end

此方法是以下代码的简短版本:

binding.eval("#{symbol}")

static VALUE bind_local_variable_get(VALUE bindval, VALUE sym) { ID lid = check_local_id(bindval, &sym const rb_binding_t *bind; const VALUE *ptr; if (!lid) goto undefined; GetBindingPtr(bindval, bind if ((ptr = get_local_variable_ptr(VM_ENV_ENVVAL_PTR(vm_block_ep(&bind->block)), lid)) == NULL) { sym = ID2SYM(lid undefined: rb_name_err_raise("local variable `%1$s' not defined for %2$s", bindval, sym } return *ptr; }

local_variable_set(symbol,obj)→obj显示源文件

设置名为symbolas的局部变量obj

def foo a = 1 bind = binding bind.local_variable_set(:a, 2) # set existing local variable `a' bind.local_variable_set(:b, 3) # create new local variable `b' # `b' exists only in binding p bind.local_variable_get(:a) #=> 2 p bind.local_variable_get(:b) #=> 3 p a #=> 2 p b #=> NameError end

此方法的行为与以下代码类似:

binding.eval("#{symbol} = #{obj}")

如果obj可以在Ruby代码中转储。

static VALUE bind_local_variable_set(VALUE bindval, VALUE sym, VALUE val) { ID lid = check_local_id(bindval, &sym rb_binding_t *bind; const VALUE *ptr; const rb_env_t *env; if (!lid) lid = rb_intern_str(sym GetBindingPtr(bindval, bind env = VM_ENV_ENVVAL_PTR(vm_block_ep(&bind->block) if ((ptr = get_local_variable_ptr(env, lid)) == NULL) { /* not found. create new env */ ptr = rb_binding_add_dynavars(bind, 1, &lid env = VM_ENV_ENVVAL_PTR(vm_block_ep(&bind->block) } RB_OBJ_WRITE(env, ptr, val return val; }

local_variables→数组显示源文件

以符号的形式返回绑定本地变量的名称。

def foo a = 1 2.times do |n| binding.local_variables #=> [:a, :n] end end

此方法是以下代码的简短版本:

binding.eval("local_variables")

static VALUE bind_local_variables(VALUE bindval) { const rb_binding_t *bind; const rb_env_t *env; GetBindingPtr(bindval, bind env = VM_ENV_ENVVAL_PTR(vm_block_ep(&bind->block) return rb_vm_env_local_variables(env }

接收器→对象显示源

返回绑定对象的绑定接收者。

static VALUE bind_receiver(VALUE bindval) { const rb_binding_t *bind; GetBindingPtr(bindval, bind return vm_block_self(&bind->block }