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显示源文件
设置名为symbol
as的局部变量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
}