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:
296 297 298 299 300 301 302 |
# File 'proc.c', line 296
static VALUE
binding_clone(VALUE self)
{
VALUE bindval = binding_dup(self);
CLONESETUP(bindval, self);
return bindval;
}
|
#dup ⇒ Object
:nodoc:
281 282 283 284 285 286 287 288 289 290 291 292 293 |
# File 'proc.c', line 281
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->blockprocval = src->blockprocval;
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"
349 350 351 352 353 354 355 356 357 |
# File 'proc.c', line 349
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’”)
532 533 534 535 536 537 538 539 540 541 542 |
# File 'proc.c', line 532
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”)
451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 |
# File 'proc.c', line 451
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) {
undefined:
rb_name_error_str(sym, "local variable `%"PRIsVALUE"' not defined for %"PRIsVALUE,
sym, bindval);
}
return *ptr;
}
|
#local_variable_set(symbol, obj) ⇒ Object
Set local variable named symbol
as obj
.
def foo a = 1 b = binding b.local_variable_set(:a, 2) # set existing local variable ‘a’ b.local_variable_set(:b, 3) # create new local variable ‘b’ # ‘b’ exists only in binding. b.local_variable_get(:a) #=> 2 b.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.
495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 |
# File 'proc.c', line 495
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”)
425 426 427 428 429 430 431 432 |
# File 'proc.c', line 425
static VALUE
bind_local_variables(VALUE bindval)
{
const rb_binding_t *bind;
GetBindingPtr(bindval, bind);
return rb_vm_env_local_variables(bind->env);
}
|
#receiver ⇒ Object
Returns the bound receiver of the binding object.
550 551 552 553 554 555 556 557 558 559 |
# File 'proc.c', line 550
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;
}
|