Class: Binding
Overview
Objects of class Binding
encapsulate the execution context at some particular place in the code and retain this context for future use. The variables, methods, value of self
, and possibly an iterator block that can be accessed in this context are all retained. Binding objects can be created using Kernel#binding
, and are made available to the callback of Kernel#set_trace_func
.
These binding objects can be passed as the second argument of the Kernel#eval
method, establishing an environment for the evaluation.
class Demo
def initialize(n)
@secret = n
end
def get_binding
return 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
Binding objects have no class-specific methods.
Instance Method Summary collapse
-
#clone ⇒ Object
:nodoc:.
-
#dup ⇒ Object
:nodoc:.
-
#eval(string[, filename [,lineno]]) ⇒ Object
Evaluates the Ruby expression(s) in string, in the binding’s context.
-
#local_variable_defined?(symbol) ⇒ Object
Returns a
true
if a local variablesymbol
exists. -
#local_variable_get(symbol) ⇒ Object
Returns a
value
of local variablesymbol
. -
#local_variable_set(symbol, obj) ⇒ Object
Set local variable named
symbol
asobj
. -
#local_variables ⇒ Array
Returns the
symbol
names of the binding’s local variables. -
#receiver ⇒ Object
Returns the bound receiver of the binding object.
Instance Method Details
#clone ⇒ Object
:nodoc:
309 310 311 312 313 314 315 |
# File 'proc.c', line 309
static VALUE
binding_clone(VALUE self)
{
VALUE bindval = binding_dup(self);
CLONESETUP(bindval, self);
return bindval;
}
|
#dup ⇒ Object
:nodoc:
295 296 297 298 299 300 301 302 303 304 305 306 |
# File 'proc.c', line 295
static VALUE
binding_dup(VALUE self)
{
VALUE bindval = rb_binding_alloc(rb_cBinding);
rb_binding_t *src, *dst;
GetBindingPtr(self, src);
GetBindingPtr(bindval, dst);
dst->env = src->env;
dst->path = src->path;
dst->first_lineno = src->first_lineno;
return bindval;
}
|
#eval(string[, filename [,lineno]]) ⇒ Object
Evaluates the Ruby expression(s) in string, in the binding’s context. If the optional filename and lineno parameters are present, they will be used when reporting syntax errors.
def get_binding(param)
return binding
end
b = get_binding("hello")
b.eval("param") #=> "hello"
362 363 364 365 366 367 368 369 370 |
# File 'proc.c', line 362
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?(symbol) ⇒ Object
Returns a true
if a local variable symbol
exists.
def foo a = 1 binding.local_variable_defined?(:a) #=> true binding.local_variable_defined?(:b) #=> false end
This method is short version of the following code.
binding.eval(“defined?(#symbol) == ‘local-variable’”)
555 556 557 558 559 560 561 562 563 564 565 |
# File 'proc.c', line 555
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;
}
|
#local_variable_get(symbol) ⇒ Object
Returns a value
of local variable symbol
.
def foo a = 1 binding.local_variable_get(:a) #=> 1 binding.local_variable_get(:b) #=> NameError end
This method is short version of the following code.
binding.eval(“#symbol”)
473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 |
# File 'proc.c', line 473
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(bind->env, 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) ⇒ Object
Set local variable named 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
This method is a similar behavior of the following code
binding.eval("#{symbol} = #{obj}")
if obj can be dumped in Ruby code.
518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 |
# File 'proc.c', line 518
static VALUE
bind_local_variable_set(VALUE bindval, VALUE sym, VALUE val)
{
ID lid = check_local_id(bindval, &sym);
rb_binding_t *bind;
VALUE *ptr;
if (!lid) lid = rb_intern_str(sym);
GetBindingPtr(bindval, bind);
if ((ptr = get_local_variable_ptr(bind->env, lid)) == NULL) {
/* not found. create new env */
ptr = rb_binding_add_dynavars(bind, 1, &lid);
}
*ptr = val;
return val;
}
|
#local_variables ⇒ Array
Returns the symbol
names of the binding’s local variables
def foo a = 1 2.times do |n| binding.local_variables #=> [:a, :n] end end
This method is short version of the following code.
binding.eval(“local_variables”)
444 445 446 447 448 449 450 451 452 453 454 |
# File 'proc.c', line 444
static VALUE
bind_local_variables(VALUE bindval)
{
const rb_binding_t *bind;
const rb_env_t *env;
GetBindingPtr(bindval, bind);
GetEnvPtr(bind->env, env);
return rb_vm_env_local_variables(env);
}
|
#receiver ⇒ Object
Returns the bound receiver of the binding object.
573 574 575 576 577 578 579 580 581 582 |
# File 'proc.c', line 573
static VALUE
bind_receiver(VALUE bindval)
{
const rb_binding_t *bind;
const rb_env_t *env;
GetBindingPtr(bindval, bind);
GetEnvPtr(bind->env, env);
return env->block.self;
}
|