首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Object

Parent:BasicObjectIncluded modules:MakeMakefile, Kernel

Object是所有Ruby对象的默认根。对象从BasicObject继承,它允许创建替代对象层次结构。对象的方法可用于所有类,除非明确覆盖。

对象在内核模块中混合,使内置的内核函数可以全局访问。虽然Object的实例方法是由内核模块定义的,但为了清楚起见,我们选择在此处记录它们。

在从Object继承的类中引用常量时,不需要使用完整的名称空间。例如,File在内部引用YourClass将找到顶级File类。

在对象方法的描述中,参数符号指的是一个符号,它可以是带引号的字符串,也可以是符号(如:name)。

常量

ARGF

ARGF是一个设计用于处理作为命令行参数给出的文件或通过STDIN传入的脚本的流。

有关更多详细信息,请参阅ARGF(该课程)。

ARGV

ARGV包含用于运行ruby的命令行参数。

像OptionParser这样的库可以用来处理命令行参数。

Bignum CROSS_COMPILING DATA

DATA是一个包含执行文件数据部分的文件。要创建数据部分,请使用__END__

代码语言:javascript
复制
$ cat t.rb
puts DATA.gets
__END__
hello world!

$ ruby t.rb
hello world!

ENV

ENV是一个用于环境变量的哈希类访问器。

有关更多详细信息,请参阅ENV(课程)。

FALSE

一个过时的别名 false

Fixnum NIL

一个过时的别名 nil

ParseError RUBY_COPYRIGHT

Ruby的版权字符串

RUBY_DESCRIPTION

全ruby版本字符串,如ruby -v版画

RUBY_ENGINE

这个ruby使用的引擎或解释器。

RUBY_ENGINE_VERSION

这个ruby使用的引擎或解释器的版本。

RUBY_PATCHLEVEL

这个ruby的patchlevel。如果这是ruby的开发版本,patchlevel将为-1

RUBY_PLATFORM

这个ruby的平台

RUBY_RELEASE_DATE

这个ruby发布的日期

RUBY_REVISION

这个ruby的SVN修订版。

RUBY_VERSION

Ruby的运行版本

SCRIPT_LINES__

如果SCRIPT_LINES__在分配后将加载的文件的内容分配给散列,则将以文件名作为关键字添加一行散列。

STDERR

保持原来的stderr

STDIN

保存原始标准输入

STDOUT

保存原始标准输出

Synchronizer

提供带计数器的两阶段锁定的类。有关详细信息,请参阅Sync_m。

Synchronizer_m

用计数器提供两相锁定的模块。

TOPLEVEL_BINDING

顶级范围的绑定

TRUE

一个过时的别名 true

ThWait

这个类监视多线程的终止。可以通过类方法ThreadsWait.all_waits访问基本功能(等到指定的线程终止)。使用实例方法可以获得更好的控制。

例:

代码语言:javascript
复制
ThreadsWait.all_waits(thr1, thr2, ...) do |t|
  STDERR.puts "Thread #{t} has terminated."
end

th = ThreadsWait.new(thread1,...)
th.next_wait # next one to be done

TimeoutError

当超时超时时,超时发生。

公共类方法

yaml_tag(url) Show source

代码语言:javascript
复制
# File ext/psych/lib/psych/core_ext.rb, line 2
def self.yaml_tag url
  Psych.add_tag(url, self)
end

公共实例方法

obj !~ other → true or false Show source

如果两个对象不匹配(使用=〜方法),则返回true ,否则返回false。

代码语言:javascript
复制
static VALUE
rb_obj_not_match(VALUE obj1, VALUE obj2)
{
    VALUE result = rb_funcall(obj1, id_match, 1, obj2);
    return RTEST(result) ? Qfalse : Qtrue;
}

obj <=> other → 0 or nil Show source

如果objother是同一个对象obj == other,则返回0 ;否则返回nil。

<=>用于通过各种方法来比较的对象,例如可枚举#排序,可枚举#最大等

您的实现<=>应返回以下值之一:-1,0,1或零。-1意味着自己比其他人小。0表示自己等于其他。1表示自己比其他人大。无意味着两个值无法比较。

当你定义<=>,你可以包括堪比获得方法<=<==>=>between?

代码语言:javascript
复制
static VALUE
rb_obj_cmp(VALUE obj1, VALUE obj2)
{
    if (obj1 == obj2 || rb_equal(obj1, obj2))
        return INT2FIX(0);
    return Qnil;
}

obj === other → true or false Show source

案例平等 - 对于类Object而言,与调用实际上相同#==,但通常被后代覆盖以在case语句中提供有意义的语义。

代码语言:javascript
复制
VALUE
rb_equal(VALUE obj1, VALUE obj2)
{
    VALUE result;

    if (obj1 == obj2) return Qtrue;
    result = rb_funcall(obj1, id_eq, 1, obj2);
    if (RTEST(result)) return Qtrue;
    return Qfalse;
}

obj =~ other → nil Show source

模式匹配 - 由后代覆盖(特别是RegexpString)以提供有意义的模式匹配语义。

代码语言:javascript
复制
static VALUE
rb_obj_match(VALUE obj1, VALUE obj2)
{
    return Qnil;
}

CSV(*args, &block) Show source

传递args给CSV.instance。

代码语言:javascript
复制
CSV("CSV,data").read
  #=> [["CSV", "data"]]

如果给出了一个块,那么该实例将通过该块并且返回值将成为该块的返回值。

代码语言:javascript
复制
CSV("CSV,data") { |c|
  c.read.any? { |a| a.include?("data") }
} #=> true

CSV("CSV,data") { |c|
  c.read.any? { |a| a.include?("zombies") }
} #=> false
代码语言:javascript
复制
# File lib/csv.rb, line 2357
def CSV(*args, &block)
  CSV.instance(*args, &block)
end

DelegateClass(superclass) Show source

该库的主要接口。定义您的课程时用于设置代表团。

代码语言:javascript
复制
class MyClass < DelegateClass(ClassToDelegateTo) # Step 1
  def initialize
    super(obj_of_ClassToDelegateTo)              # Step 2
  end
end

这里有一个使用Tempfile的例子,它实际上是一个File对象,它有一些关于存储位置和文件何时被删除的特殊规则。这几乎成为教科书如何使用委派的完美例子。

代码语言:javascript
复制
class Tempfile < DelegateClass(File)
  # constant and class member data initialization...

  def initialize(basename, tmpdir=Dir::tmpdir)
    # build up file path/name in var tmpname...

    @tmpfile = File.open(tmpname, File::RDWR|File::CREAT|File::EXCL, 0600)

    # ...

    super(@tmpfile)

    # below this point, all methods of File are supported...
  end

  # ...
end

调用超类方法

代码语言:javascript
复制
# File lib/delegate.rb, line 377
def DelegateClass(superclass)
  klass = Class.new(Delegator)
  methods = superclass.instance_methods
  methods -= ::Delegator.public_api
  methods -= [:to_s, :inspect, :=~, :!~, :===]
  klass.module_eval do
    def __getobj__ # :nodoc:
      unless defined?(@delegate_dc_obj)
        return yield if block_given?
        __raise__ ::ArgumentError, "not delegated"
      end
      @delegate_dc_obj
    end
    def __setobj__(obj)  # :nodoc:
      __raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj)
      @delegate_dc_obj = obj
    end
    methods.each do |method|
      define_method(method, Delegator.delegating_block(method))
    end
  end
  klass.define_singleton_method :public_instance_methods do |all=true|
    super(all) - superclass.protected_instance_methods
  end
  klass.define_singleton_method :protected_instance_methods do |all=true|
    super(all) | superclass.protected_instance_methods
  end
  return klass
end

Digest(name) → digest_subclass Show source

name即使涉及按需加载,也会以线程安全的方式返回摘要子类。

代码语言:javascript
复制
require 'digest'

Digest("MD5")
# => Digest::MD5

Digest(:SHA256)
# => Digest::SHA256

Digest(:Foo)
# => LoadError: library not found for class Digest::Foo -- digest/foo
代码语言:javascript
复制
# File ext/digest/lib/digest.rb, line 95
def Digest(name)
  const = name.to_sym
  Digest::REQUIRE_MUTEX.synchronize {
    # Ignore autoload's because it is void when we have #const_missing
    Digest.const_missing(const)
  }
rescue LoadError
  # Constants do not necessarily rely on digest/*.
  if Digest.const_defined?(const)
    Digest.const_get(const)
  else
    raise
  end
end

class → class Show source

返回obj的类。此方法必须始终使用明确的接收方来调用,因为class它也是Ruby中的保留字。

代码语言:javascript
复制
1.class      #=> Integer
self.class   #=> Object
代码语言:javascript
复制
VALUE
rb_obj_class(VALUE obj)
{
    return rb_class_real(CLASS_OF(obj));
}

clone(freeze: true) → an_object Show source

产生的浅表副本OBJ的-the实例变量OBJ被复制,而不是它们所引用的对象。clone复制冻结(除非:冻结关键字参数赋予一个假值)和受污染的obj状态。另请参阅下面的讨论Object#dup

代码语言:javascript
复制
class Klass
   attr_accessor :str
end
s1 = Klass.new      #=> #<Klass:0x401b3a38>
s1.str = "Hello"    #=> "Hello"
s2 = s1.clone       #=> #<Klass:0x401b3998 @str="Hello">
s2.str[1,4] = "i"   #=> "i"
s1.inspect          #=> "#<Klass:0x401b3a38 @str=\"Hi\">"
s2.inspect          #=> "#<Klass:0x401b3998 @str=\"Hi\">"

此方法可能具有类特定的行为。如果是这样,该行为将记录在initialize_copy该类的#方法下。

代码语言:javascript
复制
static VALUE
rb_obj_clone2(int argc, VALUE *argv, VALUE obj)
{
    static ID keyword_ids[1];
    VALUE opt;
    VALUE kwargs[1];
    VALUE clone;
    VALUE singleton;
    VALUE kwfreeze = Qtrue;

    if (!keyword_ids[0]) {
        CONST_ID(keyword_ids[0], "freeze");
    }
    rb_scan_args(argc, argv, "0:", &opt);
    if (!NIL_P(opt)) {
        rb_get_kwargs(opt, keyword_ids, 0, 1, kwargs);
        kwfreeze = kwargs[0];
        if (kwfreeze != Qundef && kwfreeze != Qtrue && kwfreeze != Qfalse) {
            rb_raise(rb_eArgError, "unexpected value for freeze: %s",
                     rb_builtin_class_name(kwfreeze));
        }
    }

    if (special_object_p(obj)) {
        if (kwfreeze == Qfalse)
            rb_raise(rb_eArgError, "can't unfreeze %s", rb_obj_classname(obj));
        return obj;
    }
    clone = rb_obj_alloc(rb_obj_class(obj));
    RBASIC(clone)->flags &= (FL_TAINT|FL_PROMOTED0|FL_PROMOTED1);
    RBASIC(clone)->flags |= RBASIC(obj)->flags & ~(FL_PROMOTED0|FL_PROMOTED1|FL_FREEZE|FL_FINALIZE);

    singleton = rb_singleton_class_clone_and_attach(obj, clone);
    RBASIC_SET_CLASS(clone, singleton);
    if (FL_TEST(singleton, FL_SINGLETON)) {
        rb_singleton_class_attached(singleton, clone);
    }

    init_copy(clone, obj);
    rb_funcall(clone, id_init_clone, 1, obj);

    if (Qfalse != kwfreeze) {
        RBASIC(clone)->flags |= RBASIC(obj)->flags & FL_FREEZE;
    }

    return clone;
}

dclone() Show source

提供了一个统一的clone操作,用于REXML :: XPathParser跨多个对象类型使用

代码语言:javascript
复制
# File lib/rexml/xpath_parser.rb, line 10
def dclone
  clone
end

default_src_encoding() Show source

不要在这里写出任何神奇的评论。

代码语言:javascript
复制
# File lib/irb/src_encoding.rb, line 2
def default_src_encoding
  return __ENCODING__
end

define_singleton_method(符号,方法)→符号显示源代码

define_singleton_method(symbol) { block } → symbol

在接收器中定义一个单例方法。该方法的参数可以是Proc,一个Method或一个UnboundMethod对象。如果指定了块,则将其用作方法主体。

代码语言:javascript
复制
class A
  class << self
    def class_name
      to_s
    end
  end
end
A.define_singleton_method(:who_am_i) do
  "I am: #{class_name}"
end
A.who_am_i   # ==> "I am: A"

guy = "Bob"
guy.define_singleton_method(:hello) { "#{self}: Hello there!" }
guy.hello    #=>  "Bob: Hello there!"
代码语言:javascript
复制
static VALUE
rb_obj_define_method(int argc, VALUE *argv, VALUE obj)
{
    VALUE klass = rb_singleton_class(obj);

    return rb_mod_define_method(argc, argv, klass);
}

display(port=$>) → nil Show source

在给定端口上打印obj(默认$>)。相当于:

代码语言:javascript
复制
def display(port=$>)
  port.write self
  nil
end

例如:

代码语言:javascript
复制
1.display
"cat".display
[ 4, 5, 6 ].display
puts

生产:

代码语言:javascript
复制
1cat[4, 5, 6]
代码语言:javascript
复制
static VALUE
rb_obj_display(int argc, VALUE *argv, VALUE self)
{
    VALUE out;

    if (argc == 0) {
        out = rb_stdout;
    }
    else {
        rb_scan_args(argc, argv, "01", &out);
    }
    rb_io_write(out, self);

    return Qnil;
}

dup → an_object Show source

产生的浅表副本OBJ的-the实例变量OBJ被复制,而不是它们所引用的对象。dup复制obj的受污染状态。

此方法可能具有类特定的行为。如果是这样,该行为将记录在initialize_copy该类的#方法下。

在dup vs克隆上

在一般情况下,clonedup可能在派生类不同的语义。虽然clone用于复制对象(包括其内部状态),但dup通常会使用后代对象的类来创建新实例。

当使用dup时,该对象已被扩展的任何模块都不会被复制。

代码语言:javascript
复制
class Klass
  attr_accessor :str
end

module Foo
  def foo; 'foo'; end
end

s1 = Klass.new #=> #<Klass:0x401b3a38>
s1.extend(Foo) #=> #<Klass:0x401b3a38>
s1.foo #=> "foo"

s2 = s1.clone #=> #<Klass:0x401b3a38>
s2.foo #=> "foo"

s3 = s1.dup #=> #<Klass:0x401b3a38>
s3.foo #=> NoMethodError: undefined method `foo' for #<Klass:0x401b3a38>
代码语言:javascript
复制
VALUE
rb_obj_dup(VALUE obj)
{
    VALUE dup;

    if (special_object_p(obj)) {
        return obj;
    }
    dup = rb_obj_alloc(rb_obj_class(obj));
    init_copy(dup, obj);
    rb_funcall(dup, id_init_dup, 1, obj);

    return dup;
}

enum_for(method = :each, *args) → enum Show source

enum_for(method = :each, *args){|*args| block} → enum

创建一个新的枚举,这将通过调用枚举methodobj,传递args(如有)。

如果给出了一个块,它将被用来计算枚举器的大小,而不需要迭代它(参见枚举器的大小)。

例子

代码语言:javascript
复制
str = "xyz"

enum = str.enum_for(:each_byte)
enum.each { |b| puts b }
# => 120
# => 121
# => 122

# protect an array from being modified by some_method
a = [1, 2, 3]
some_method(a.to_enum)

当为泛型Enumerable定义方法时,通常会调用#to_enum,以防未传递任何块。

这里是一个例子,带参数传递和一个尺寸块:

代码语言:javascript
复制
module Enumerable
  # a generic method to repeat the values of any enumerable
  def repeat(n)
    raise ArgumentError, "#{n} is negative!" if n < 0
    unless block_given?
      return to_enum(__method__, n) do # __method__ is :repeat here
        sz = size     # Call size and multiply by n...
        sz * n if sz  # but return nil if size itself is nil
      end
    end
    each do |*val|
      n.times { yield *val }
    end
  end
end

%[hello world].repeat(2) { |w| puts w }
  # => Prints 'hello', 'hello', 'world', 'world'
enum = (1..14).repeat(3)
  # => returns an Enumerator when called without a block
enum.first(4) # => [1, 1, 1, 2]
enum.size # => 42
代码语言:javascript
复制
static VALUE
obj_to_enum(int argc, VALUE *argv, VALUE obj)
{
    VALUE enumerator, meth = sym_each;

    if (argc > 0) {
        --argc;
        meth = *argv++;
    }
    enumerator = rb_enumeratorize_with_size(obj, meth, argc, argv, 0);
    if (rb_block_given_p()) {
        enumerator_ptr(enumerator)->size = rb_block_proc();
    }
    return enumerator;
}

obj == other → true or false Show source

equal?(other) → true or false

eql?(other) → true or false

平等-在Object水平,==返回true只有当objother是同一对象。通常,这个方法在后代类中被覆盖以提供类特定的含义。

与此不同==,该equal?方法不应被子类覆盖,因为它用于确定对象标识(即,a.equal?(b)当且仅当a与对象相同时b):

代码语言:javascript
复制
obj = "a"
other = obj.dup

obj == other      #=> true
obj.equal? other  #=> false
obj.equal? obj    #=> true

eql?方法返回trueif objother引用相同的散列键。Hash使用它来测试成员是否相等。对于课堂上的对象而言Object,它eql?是同义词==。子类通常通过别名eql?重写==方法来延续这一传统,但也有例外。Numeric类型,例如,执行类型转换==,但不跨越eql?,因此:

代码语言:javascript
复制
1 == 1.0     #=> true
1.eql? 1.0   #=> false
代码语言:javascript
复制
VALUE
rb_obj_equal(VALUE obj1, VALUE obj2)
{
    if (obj1 == obj2) return Qtrue;
    return Qfalse;
}

extend(module, ...) → obj Show source

将每个模块的实例方法作为参数添加到obj中

代码语言:javascript
复制
module Mod
  def hello
    "Hello from Mod.\n"
  end
end

class Klass
  def hello
    "Hello from Klass.\n"
  end
end

k = Klass.new
k.hello         #=> "Hello from Klass.\n"
k.extend(Mod)   #=> #<Klass:0x401b3bc8>
k.hello         #=> "Hello from Mod.\n"
代码语言:javascript
复制
static VALUE
rb_obj_extend(int argc, VALUE *argv, VALUE obj)
{
    int i;
    ID id_extend_object, id_extended;

    CONST_ID(id_extend_object, "extend_object");
    CONST_ID(id_extended, "extended");

    rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
    for (i = 0; i < argc; i++)
        Check_Type(argv[i], T_MODULE);
    while (argc--) {
        rb_funcall(argv[argc], id_extend_object, 1, obj);
        rb_funcall(argv[argc], id_extended, 1, obj);
    }
    return obj;
}

freeze → obj Show source

阻止对obj的进一步修改。RuntimeError如果尝试修改,则会提出A. 无法解冻冻结的物体。另见Object#frozen?

此方法返回自我。

代码语言:javascript
复制
a = [ "a", "b", "c" ]
a.freeze
a << "z"

produces:

代码语言:javascript
复制
prog.rb:3:in `<<': can't modify frozen Array (RuntimeError)
 from prog.rb:3

以下类的对象总是被冻结:整数,浮点,符号。

代码语言:javascript
复制
VALUE
rb_obj_freeze(VALUE obj)
{
    if (!OBJ_FROZEN(obj)) {
        OBJ_FREEZE(obj);
        if (SPECIAL_CONST_P(obj)) {
            rb_bug("special consts should be frozen.");
        }
    }
    return obj;
}

frozen? → true or false Show source

Returns the freeze status of obj.

代码语言:javascript
复制
a = [ "a", "b", "c" ]
a.freeze    #=> ["a", "b", "c"]
a.frozen?   #=> true
代码语言:javascript
复制
VALUE
rb_obj_frozen_p(VALUE obj)
{
    return OBJ_FROZEN(obj) ? Qtrue : Qfalse;
}

hash → integer Show source

为此对象生成一个Integer散列​​值。此功能必须具有所a.eql?(b)暗示的属性a.hash == b.hash

散列值与eql一起使用?通过Hash类来确定两个对象是否引用相同的散列键。任何超过Integer容量的散列值在使用前都会被截断。

在Ruby的调用或实现中,对象的哈希值可能不相同。如果您需要Ruby调用和实现中的稳定标识符,则需要使用自定义方法生成一个标识符。

代码语言:javascript
复制
VALUE
rb_obj_hash(VALUE obj)
{
    VALUE oid = rb_obj_id(obj);
#if SIZEOF_LONG == SIZEOF_VOIDP
    st_index_t index = NUM2LONG(oid);
#elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
    st_index_t index = NUM2LL(oid);
#else
# error not supported
#endif
    return LONG2FIX(rb_objid_hash(index));
}

inspect → string Show source

返回一个包含obj的人类可读表示的字符串。默认inspect显示对象的类名,对象id的编码,以及实例变量及其值的列表(通过对它们中的每一个调用检查)。用户定义的类应该重写此方法以提供更好的obj表示。重写此方法时,它应该返回一个字符串,其编码与默认外部编码兼容。

代码语言:javascript
复制
[ 1, 2, 3..4, 'five' ].inspect   #=> "[1, 2, 3..4, \"five\"]"
Time.new.inspect                 #=> "2008-03-08 19:43:39 +0900"

class Foo
end
Foo.new.inspect                  #=> "#<Foo:0x0300c868>"

class Bar
  def initialize
    @bar = 1
  end
end
Bar.new.inspect                  #=> "#<Bar:0x0300c868 @bar=1>"
代码语言:javascript
复制
static VALUE
rb_obj_inspect(VALUE obj)
{
    if (rb_ivar_count(obj) > 0) {
        VALUE str;
        VALUE c = rb_class_name(CLASS_OF(obj));

        str = rb_sprintf("-<%"PRIsVALUE":%p", c, (void*)obj);
        return rb_exec_recursive(inspect_obj, obj, str);
    }
    else {
        return rb_any_to_s(obj);
    }
}

instance_of?(class) → true or false Show source

如果obj是给定类的实例,则返回true。另见Object#kind_of?

代码语言:javascript
复制
class A;     end
class B < A; end
class C < B; end

b = B.new
b.instance_of? A   #=> false
b.instance_of? B   #=> true
b.instance_of? C   #=> false
代码语言:javascript
复制
VALUE
rb_obj_is_instance_of(VALUE obj, VALUE c)
{
    c = class_or_module_required(c);
    if (rb_obj_class(obj) == c) return Qtrue;
    return Qfalse;
}

instance_variable_defined?(symbol) → true or false Show source

instance_variable_defined?(string) → true or false

true如果给定的实例变量是在obj中定义的,则返回。字符串参数被转换为符号。

代码语言:javascript
复制
class Fred
  def initialize(p1, p2)
    @a, @b = p1, p2
  end
end
fred = Fred.new('cat', 99)
fred.instance_variable_defined?(:@a)    #=> true
fred.instance_variable_defined?("@b")   #=> true
fred.instance_variable_defined?("@c")   #=> false
代码语言:javascript
复制
static VALUE
rb_obj_ivar_defined(VALUE obj, VALUE iv)
{
    ID id = id_for_var(obj, iv, an, instance);

    if (!id) {
        return Qfalse;
    }
    return rb_ivar_defined(obj, id);
}

instance_variable_get(symbol) → obj Show source

instance_variable_get(string) → obj

返回给定实例变量的值,如果未设置实例变量,则返回nil。@应该为常规实例变量包含变量名称的一部分。NameError如果提供的符号作为实例变量名称无效,则引发异常。字符串参数被转换为符号。

代码语言:javascript
复制
class Fred
  def initialize(p1, p2)
    @a, @b = p1, p2
  end
end
fred = Fred.new('cat', 99)
fred.instance_variable_get(:@a)    #=> "cat"
fred.instance_variable_get("@b")   #=> 99
代码语言:javascript
复制
static VALUE
rb_obj_ivar_get(VALUE obj, VALUE iv)
{
    ID id = id_for_var(obj, iv, an, instance);

    if (!id) {
        return Qnil;
    }
    return rb_ivar_get(obj, id);
}

instance_variable_set(symbol, obj) → obj Show source

instance_variable_set(string, obj) → obj

将由符号命名的实例变量设置为给定的对象,从而使该类作者试图提供适当封装的努力受挫。此调用之前,变量不必存在。如果实例变量名称作为字符串传递,则该字符串将转换为符号。

代码语言:javascript
复制
class Fred
  def initialize(p1, p2)
    @a, @b = p1, p2
  end
end
fred = Fred.new('cat', 99)
fred.instance_variable_set(:@a, 'dog')   #=> "dog"
fred.instance_variable_set(:@c, 'cat')   #=> "cat"
fred.inspect                             #=> "#<Fred:0x401b3da8 @a=\"dog\", @b=99, @c=\"cat\">"
代码语言:javascript
复制
static VALUE
rb_obj_ivar_set(VALUE obj, VALUE iv, VALUE val)
{
    ID id = id_for_var(obj, iv, an, instance);
    if (!id) id = rb_intern_str(iv);
    return rb_ivar_set(obj, id, val);
}

instance_variables → array Show source

返回接收器的实例变量名称数组。请注意,简单地定义一个访问器不会创建相应的实例变量。

代码语言:javascript
复制
class Fred
  attr_accessor :a1
  def initialize
    @iv = 3
  end
end
Fred.new.instance_variables   #=> [:@iv]
代码语言:javascript
复制
VALUE
rb_obj_instance_variables(VALUE obj)
{
    VALUE ary;

    ary = rb_ary_new();
    rb_ivar_foreach(obj, ivar_i, ary);
    return ary;
}

is_a?(class) → true or false Show source

返回true如果是类的OBJ,或者如果是的超类的一个OBJ或模块包括在物镜

代码语言:javascript
复制
module M;    end
class A
  include M
end
class B < A; end
class C < B; end

b = B.new
b.is_a? A          #=> true
b.is_a? B          #=> true
b.is_a? C          #=> false
b.is_a? M          #=> true

b.kind_of? A       #=> true
b.kind_of? B       #=> true
b.kind_of? C       #=> false
b.kind_of? M       #=> true
代码语言:javascript
复制
VALUE
rb_obj_is_kind_of(VALUE obj, VALUE c)
{
    VALUE cl = CLASS_OF(obj);

    c = class_or_module_required(c);
    return class_search_ancestor(cl, RCLASS_ORIGIN(c)) ? Qtrue : Qfalse;
}

itself → an_object Show source

返回obj

代码语言:javascript
复制
string = 'my string' #=> "my string"
string.itself.object_id == string.object_id #=> true
代码语言:javascript
复制
static VALUE
rb_obj_itself(VALUE obj)
{
    return obj;
}

kind_of?(class) → true or false Show source

返回true如果是类的OBJ,或者如果是的超类的一个OBJ或模块包括在物镜

代码语言:javascript
复制
module M;    end
class A
  include M
end
class B < A; end
class C < B; end

b = B.new
b.is_a? A          #=> true
b.is_a? B          #=> true
b.is_a? C          #=> false
b.is_a? M          #=> true

b.kind_of? A       #=> true
b.kind_of? B       #=> true
b.kind_of? C       #=> false
b.kind_of? M       #=> true
代码语言:javascript
复制
VALUE
rb_obj_is_kind_of(VALUE obj, VALUE c)
{
    VALUE cl = CLASS_OF(obj);

    c = class_or_module_required(c);
    return class_search_ancestor(cl, RCLASS_ORIGIN(c)) ? Qtrue : Qfalse;
}

method(sym) → method Show source

obj中查找命名方法作为接收方,返回一个Method对象(或提升NameError)。该Method对象充当obj对象实例中的闭包,因此实例变量和值self保持可用。

代码语言:javascript
复制
class Demo
  def initialize(n)
    @iv = n
  end
  def hello()
    "Hello, @iv = #{@iv}"
  end
end

k = Demo.new(99)
m = k.method(:hello)
m.call   #=> "Hello, @iv = 99"

l = Demo.new('Fred')
m = l.method("hello")
m.call   #=> "Hello, @iv = Fred"
代码语言:javascript
复制
VALUE
rb_obj_method(VALUE obj, VALUE vid)
{
    return obj_method(obj, vid, FALSE);
}

methods(regular=true) → array Show source

返回obj的public和protected方法的名称列表。这将包括obj的祖先可以访问的所有方法。如果可选参数是false,它返回一个obj <'>的公共和受保护的单例方法数组,该数组将不包含<i> obj中包含的模块中的方法

代码语言:javascript
复制
class Klass
  def klass_method()
  end
end
k = Klass.new
k.methods[0..9]    #=> [:klass_method, :nil?, :===,
                   #    :==~, :!, :eql?
                   #    :hash, :<=>, :class, :singleton_class]
k.methods.length   #=> 56

k.methods(false)   #=> []
def k.singleton_method; end
k.methods(false)   #=> [:singleton_method]

module M123; def m123; end end
k.extend M123
k.methods(false)   #=> [:singleton_method]
代码语言:javascript
复制
VALUE
rb_obj_methods(int argc, const VALUE *argv, VALUE obj)
{
    rb_check_arity(argc, 0, 1);
    if (argc > 0 && !RTEST(argv[0])) {
	return rb_obj_singleton_methods(argc, argv, obj);
    }
    return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_i);
}

nil? → true or false Show source

只有对象响应truenil?

代码语言:javascript
复制
Object.new.nil?   #=> false
nil.nil?          #=> true
代码语言:javascript
复制
static VALUE
rb_false(VALUE obj)
{
    return Qfalse;
}

__id__ → integer Show source

object_id → integer

返回一个整数标识符obj

object_id对于给定对象的所有调用都会返回相同的数字,并且没有两个活动对象将共享一个ID。

注意:内建类的一些对象被重新用于优化。立即值和冻结字符串文字就是这种情况。

立即值不按引用传递,而是由值传递:niltruefalse,Fixnums,符号,还有一些浮标。

代码语言:javascript
复制
Object.new.object_id  == Object.new.object_id  # => false
(21 * 2).object_id    == (21 * 2).object_id    # => true
"hello".object_id     == "hello".object_id     # => false
"hi".freeze.object_id == "hi".freeze.object_id # => true
代码语言:javascript
复制
VALUE
rb_obj_id(VALUE obj)
{
    /*
     *                32-bit VALUE space
     *          MSB ------------------------ LSB
     *  false   00000000000000000000000000000000
     *  true    00000000000000000000000000000010
     *  nil     00000000000000000000000000000100
     *  undef   00000000000000000000000000000110
     *  symbol  ssssssssssssssssssssssss00001110
     *  object  oooooooooooooooooooooooooooooo00        = 0 (mod sizeof(RVALUE))
     *  fixnum  fffffffffffffffffffffffffffffff1
     *
     *                    object_id space
     *                                       LSB
     *  false   00000000000000000000000000000000
     *  true    00000000000000000000000000000010
     *  nil     00000000000000000000000000000100
     *  undef   00000000000000000000000000000110
     *  symbol   000SSSSSSSSSSSSSSSSSSSSSSSSSSS0        S...S % A = 4 (S...S = s...s * A + 4)
     *  object   oooooooooooooooooooooooooooooo0        o...o % A = 0
     *  fixnum  fffffffffffffffffffffffffffffff1        bignum if required
     *
     *  where A = sizeof(RVALUE)/4
     *
     *  sizeof(RVALUE) is
     *  20 if 32-bit, double is 4-byte aligned
     *  24 if 32-bit, double is 8-byte aligned
     *  40 if 64-bit
     */
    if (STATIC_SYM_P(obj)) {
        return (SYM2ID(obj) * sizeof(RVALUE) + (4 << 2)) | FIXNUM_FLAG;
    }
    else if (FLONUM_P(obj)) {
#if SIZEOF_LONG == SIZEOF_VOIDP
        return LONG2NUM((SIGNED_VALUE)obj);
#else
        return LL2NUM((SIGNED_VALUE)obj);
#endif
    }
    else if (SPECIAL_CONST_P(obj)) {
        return LONG2NUM((SIGNED_VALUE)obj);
    }
    return nonspecial_obj_id(obj);
}

private_methods(all=true) → array Show source

返回obj可访问的私有方法列表。如果all参数设置为false,则只会列出接收器中的那些方法。

代码语言:javascript
复制
VALUE
rb_obj_private_methods(int argc, const VALUE *argv, VALUE obj)
{
    return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_priv_i);
}

protected_methods(all=true) → array Show source

返回obj可访问的受保护方法的列表。如果all参数设置为false,则只会列出接收器中的那些方法。

代码语言:javascript
复制
VALUE
rb_obj_protected_methods(int argc, const VALUE *argv, VALUE obj)
{
    return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_prot_i);
}

to_yaml(options = {}) Show source

将对象转换为YAML。有关可用的更多信息,请参阅Psych.dump options

代码语言:javascript
复制
# File ext/psych/lib/psych/core_ext.rb, line 13
def psych_to_yaml options = {}
  Psych.dump self, options
end

Also aliased as: to_yaml

public_method(sym) → method Show source

方法类似,仅搜索公共方法。

代码语言:javascript
复制
VALUE
rb_obj_public_method(VALUE obj, VALUE vid)
{
    return obj_method(obj, vid, TRUE);
}

public_methods(all=true) → array Show source

返回obj可访问的公共方法列表。如果all参数设置为false,则只会列出接收器中的那些方法。

代码语言:javascript
复制
VALUE
rb_obj_public_methods(int argc, const VALUE *argv, VALUE obj)
{
    return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_pub_i);
}

public_send(symbol , args...) → obj Show source

public_send(string , args...) → obj

调用由符号标识的方法,向其传递任何指定的参数。与发送不同,#public_send仅调用公共方法。当方法由字符串标识时,字符串将转换为符号。

代码语言:javascript
复制
1.public_send(:puts, "hello")  # causes NoMethodError
代码语言:javascript
复制
VALUE
rb_f_public_send(int argc, VALUE *argv, VALUE recv)
{
    return send_internal(argc, argv, recv, CALL_PUBLIC);
}

remove_instance_variable(symbol) → obj Show source

obj中移除指定的实例变量,返回该变量的值。

代码语言:javascript
复制
class Dummy
  attr_reader :var
  def initialize
    @var = 99
  end
  def remove
    remove_instance_variable(:@var)
  end
end
d = Dummy.new
d.var      #=> 99
d.remove   #=> 99
d.var      #=> nil
代码语言:javascript
复制
VALUE
rb_obj_remove_instance_variable(VALUE obj, VALUE name)
{
    VALUE val = Qnil;
    const ID id = id_for_var(obj, name, an, instance);
    st_data_t n, v;
    struct st_table *iv_index_tbl;
    st_data_t index;

    rb_check_frozen(obj);
    if (!id) {
	goto not_defined;
    }

    switch (BUILTIN_TYPE(obj)) {
      case T_OBJECT:
        iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
        if (!iv_index_tbl) break;
        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
        if (ROBJECT_NUMIV(obj) <= index) break;
        val = ROBJECT_IVPTR(obj)[index];
        if (val != Qundef) {
            ROBJECT_IVPTR(obj)[index] = Qundef;
            return val;
        }
	break;
      case T_CLASS:
      case T_MODULE:
	n = id;
	if (RCLASS_IV_TBL(obj) && st_delete(RCLASS_IV_TBL(obj), &n, &v)) {
	    return (VALUE)v;
	}
	break;
      default:
	if (FL_TEST(obj, FL_EXIVAR)) {
	    if (generic_ivar_remove(obj, id, &val)) {
		return val;
	    }
	}
	break;
    }

  not_defined:
    rb_name_err_raise("instance variable %1$s not defined",
		      obj, name);
    UNREACHABLE;
}

respond_to?(symbol, include_all=false) → true or false Show source

respond_to?(string, include_all=false) → true or false

true如果obj响应给定的方法,则返回。只有当可选的第二个参数评估时,私有和受保护的方法才包含在搜索中true

如果该方法未实现,则为Windows上的Process.fork,GNU / Linux上的File.lchmod等,则返回false。

如果方法未定义,respond_to_missing?则调用方法并返回结果。

当方法名称参数以字符串形式给出时,该字符串将转换为符号。

代码语言:javascript
复制
static VALUE
obj_respond_to(int argc, VALUE *argv, VALUE obj)
{
    VALUE mid, priv;
    ID id;
    rb_thread_t *th = GET_THREAD();

    rb_scan_args(argc, argv, "11", &mid, &priv);
    if (!(id = rb_check_id(&mid))) {
        VALUE ret = basic_obj_respond_to_missing(th, CLASS_OF(obj), obj,
                                                 rb_to_symbol(mid), priv);
        if (ret == Qundef) ret = Qfalse;
        return ret;
    }
    if (basic_obj_respond_to(th, obj, id, !RTEST(priv)))
        return Qtrue;
    return Qfalse;
}

respond_to_missing?(symbol,include_all)→true或false显示源

respond_to_missing?(string, include_all) → true or false

DO NOT USE THIS DIRECTLY.

Hook方法返回obj是否可以响应id方法。

当方法名称参数以字符串形式给出时,该字符串将转换为符号。

请参阅respond_to?和BasicObject的示例。

代码语言:javascript
复制
static VALUE
obj_respond_to_missing(VALUE obj, VALUE mid, VALUE priv)
{
    return Qfalse;
}

send(symbol , args...) → obj Show source

__send__(symbol , args...) → obj

send(string , args...) → obj

__send__(string , args...) → obj

调用由符号标识的方法,向其传递任何指定的参数。__send__如果名称sendobj中的现有方法冲突,则可以使用。当方法由字符串标识时,字符串将转换为符号。

代码语言:javascript
复制
class Klass
  def hello(*args)
    "Hello " + args.join(' ')
  end
end
k = Klass.new
k.send :hello, "gentle", "readers"   #=> "Hello gentle readers"
代码语言:javascript
复制
VALUE
rb_f_send(int argc, VALUE *argv, VALUE recv)
{
    return send_internal(argc, argv, recv, CALL_FCALL);
}

singleton_class → class Show source

返回obj的单例类。如果obj没有一个,这个方法创建一个新的单例类。

如果objnil,,true或者false,它分别返回NilClass,TrueClass或FalseClass。如果obj是整型,浮点型或符号,则会引发TypeError。

代码语言:javascript
复制
Object.new.singleton_class  #=> #<Class:#<Object:0xb7ce1e24>>
String.singleton_class      #=> #<Class:String>
nil.singleton_class         #=> NilClass
代码语言:javascript
复制
static VALUE
rb_obj_singleton_class(VALUE obj)
{
    return rb_singleton_class(obj);
}

singleton_method(sym) → method Show source

方法类似,仅搜索单例方法。

代码语言:javascript
复制
class Demo
  def initialize(n)
    @iv = n
  end
  def hello()
    "Hello, @iv = #{@iv}"
  end
end

k = Demo.new(99)
def k.hi
  "Hi, @iv = #{@iv}"
end
m = k.singleton_method(:hi)
m.call   #=> "Hi, @iv = 99"
m = k.singleton_method(:hello) #=> NameError
代码语言:javascript
复制
VALUE
rb_obj_singleton_method(VALUE obj, VALUE vid)
{
    const rb_method_entry_t *me;
    VALUE klass;
    ID id = rb_check_id(&vid);

    if (!id) {
        if (!NIL_P(klass = rb_singleton_class_get(obj)) &&
            respond_to_missing_p(klass, obj, vid, FALSE)) {
            id = rb_intern_str(vid);
            return mnew_missing(klass, obj, id, rb_cMethod);
        }
      undef:
        rb_name_err_raise("undefined singleton method `%1$s' for `%2$s'",
                          obj, vid);
    }
    if (NIL_P(klass = rb_singleton_class_get(obj)) ||
        UNDEFINED_METHOD_ENTRY_P(me = rb_method_entry_at(klass, id)) ||
        UNDEFINED_REFINED_METHOD_P(me->def)) {
        vid = ID2SYM(id);
        goto undef;
    }
    return mnew_from_me(me, klass, obj, id, rb_cMethod, FALSE);
}

singleton_methods(all=true) → array Show source

返回obj的单例方法的名称数组。如果可选的all参数为true,则列表将包含obj中包含的模块中的方法。只有公共和受保护的单例方法才会返回。

代码语言:javascript
复制
module Other
  def three() end
end

class Single
  def Single.four() end
end

a = Single.new

def a.one()
end

class << a
  include Other
  def two()
  end
end

Single.singleton_methods    #=> [:four]
a.singleton_methods(false)  #=> [:two, :one]
a.singleton_methods         #=> [:two, :one, :three]
代码语言:javascript
复制
VALUE
rb_obj_singleton_methods(int argc, const VALUE *argv, VALUE obj)
{
    VALUE recur, ary, klass, origin;
    struct method_entry_arg me_arg;
    struct rb_id_table *mtbl;

    if (argc == 0) {
	recur = Qtrue;
    }
    else {
	rb_scan_args(argc, argv, "01", &recur);
    }
    klass = CLASS_OF(obj);
    origin = RCLASS_ORIGIN(klass);
    me_arg.list = st_init_numtable();
    me_arg.recur = RTEST(recur);
    if (klass && FL_TEST(klass, FL_SINGLETON)) {
	if ((mtbl = RCLASS_M_TBL(origin)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
	klass = RCLASS_SUPER(klass);
    }
    if (RTEST(recur)) {
	while (klass && (FL_TEST(klass, FL_SINGLETON) || RB_TYPE_P(klass, T_ICLASS))) {
	    if (klass != origin && (mtbl = RCLASS_M_TBL(klass)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
	    klass = RCLASS_SUPER(klass);
	}
    }
    ary = rb_ary_new();
    st_foreach(me_arg.list, ins_methods_i, ary);
    st_free_table(me_arg.list);

    return ary;
}

sysread(io, size) Show source

cgi_runner.rb – CGI launcher.

$IPR: cgi_runner.rb,v 1.9 2002/09/25 11:33:15 gotoyuzo Exp $

代码语言:javascript
复制
# File lib/webrick/httpservlet/cgi_runner.rb, line 11
def sysread(io, size)
  buf = ""
  while size > 0
    tmp = io.sysread(size)
    buf << tmp
    size -= tmp.bytesize
  end
  return buf
end

taint → obj Show source

将对象标记为污点。

被标记为污染的对象将受到各种内置方法的限制。这是为了防止不安全的数据,例如从Kernel#gets读取的命令行参数或字符串,无意中破坏用户的系统。

要检查某个对象是否受污染,请使用受污染的?

如果您的代码已检查并确定它是安全的,则应该只对一个受污染的对象进行修剪。要做到这一点使用untaint。

代码语言:javascript
复制
VALUE
rb_obj_taint(VALUE obj)
{
    if (!OBJ_TAINTED(obj) && OBJ_TAINTABLE(obj)) {
        rb_check_frozen(obj);
        OBJ_TAINT(obj);
    }
    return obj;
}

tainted? → true or false Show source

如果对象受到污染,则返回true。

请参阅污点了解更多信息。

代码语言:javascript
复制
VALUE
rb_obj_tainted(VALUE obj)
{
    if (OBJ_TAINTED(obj))
        return Qtrue;
    return Qfalse;
}

tap{|x|...} → obj Show source

产生自我到块中,然后返回自我。该方法的主要目的是“挖掘”方法链,以便对链中的中间结果执行操作。

代码语言:javascript
复制
(1..10)                .tap {|x| puts "original: #{x.inspect}"}
  .to_a                .tap {|x| puts "array: #{x.inspect}"}
  .select {|x| x%2==0} .tap {|x| puts "evens: #{x.inspect}"}
  .map {|x| x*x}       .tap {|x| puts "squares: #{x.inspect}"}
代码语言:javascript
复制
VALUE
rb_obj_tap(VALUE obj)
{
    rb_yield(obj);
    return obj;
}

timeout(*args, &block) Show source

代码语言:javascript
复制
# File lib/timeout.rb, line 119
def timeout(*args, &block)
  warn "#{caller_locations(1, 1)[0]}: Object##{__method__} is deprecated, use Timeout.timeout instead."
  Timeout.timeout(*args, &block)
end

to_enum(method = :each, *args) → enum Show source

to_enum(method = :each, *args) {|*args| block} → enum

创建一个新的枚举,这将通过调用枚举methodobj,传递args(如有)。

如果给出了一个块,它将被用来计算枚举器的大小,而不需要迭代它(参见枚举器的大小)。

例子

代码语言:javascript
复制
str = "xyz"

enum = str.enum_for(:each_byte)
enum.each { |b| puts b }
# => 120
# => 121
# => 122

# protect an array from being modified by some_method
a = [1, 2, 3]
some_method(a.to_enum)

当为泛型Enumerable定义方法时,通常会调用#to_enum,以防未传递任何块。

这里是一个例子,带参数传递和一个尺寸块:

代码语言:javascript
复制
module Enumerable
  # a generic method to repeat the values of any enumerable
  def repeat(n)
    raise ArgumentError, "#{n} is negative!" if n < 0
    unless block_given?
      return to_enum(__method__, n) do # __method__ is :repeat here
        sz = size     # Call size and multiply by n...
        sz * n if sz  # but return nil if size itself is nil
      end
    end
    each do |*val|
      n.times { yield *val }
    end
  end
end

%[hello world].repeat(2) { |w| puts w }
  # => Prints 'hello', 'hello', 'world', 'world'
enum = (1..14).repeat(3)
  # => returns an Enumerator when called without a block
enum.first(4) # => [1, 1, 1, 2]
enum.size # => 42
代码语言:javascript
复制
static VALUE
obj_to_enum(int argc, VALUE *argv, VALUE obj)
{
    VALUE enumerator, meth = sym_each;

    if (argc > 0) {
        --argc;
        meth = *argv++;
    }
    enumerator = rb_enumeratorize_with_size(obj, meth, argc, argv, 0);
    if (rb_block_given_p()) {
        enumerator_ptr(enumerator)->size = rb_block_proc();
    }
    return enumerator;
}

to_s → string Show source

返回表示obj的字符串。默认to_s打印对象的类和对象ID的编码。作为特殊情况,Ruby程序的初始执行上下文的顶级对象返回“main”。

代码语言:javascript
复制
VALUE
rb_any_to_s(VALUE obj)
{
    VALUE str;
    VALUE cname = rb_class_name(CLASS_OF(obj));

    str = rb_sprintf("#<%"PRIsVALUE":%p>", cname, (void*)obj);
    OBJ_INFECT(str, obj);

    return str;
}

to_yaml(options = {})

Alias for: psych_to_yaml

trust → obj Show source

弃用的方法相当于不相关的。

代码语言:javascript
复制
VALUE
rb_obj_trust(VALUE obj)
{
    rb_warning("trust is deprecated and its behavior is same as untaint");
    return rb_obj_untaint(obj);
}

unknown() Show source

mathn可以使Ruby中的数学运算更精确,并集成其他数学标准库。

没有数学:

代码语言:javascript
复制
3 / 2 => 1 # Integer

用mathn:

代码语言:javascript
复制
3 / 2 => 3/2 # Rational

mathn保持准确的价值。

Without mathn:

代码语言:javascript
复制
20 / 9 * 3 * 14 / 7 * 3 / 2 # => 18

With mathn:

代码语言:javascript
复制
20 / 9 * 3 * 14 / 7 * 3 / 2 # => 20

当你需要'mathn'时,Prime,CMath,Matrix和Vector的库也会被加载。

版权

作者:Keiju ISHITSUKA(SHL Japan Inc.)

代码语言:javascript
复制
# File lib/mathn.rb, line 40
warn('lib/mathn.rb is deprecated') if $VERBOSE

untaint → obj Show source

从物体上移除污迹。

请参阅污点了解更多信息。

代码语言:javascript
复制
VALUE
rb_obj_untaint(VALUE obj)
{
    if (OBJ_TAINTED(obj)) {
        rb_check_frozen(obj);
        FL_UNSET(obj, FL_TAINT);
    }
    return obj;
}

untrust → obj Show source

弃用的方法相当于污染。

代码语言:javascript
复制
VALUE
rb_obj_untrust(VALUE obj)
{
    rb_warning("untrust is deprecated and its behavior is same as taint");
    return rb_obj_taint(obj);
}

untrusted? → true or false Show source

弃用的方法,相当于污染?

代码语言:javascript
复制
VALUE
rb_obj_untrusted(VALUE obj)
{
    rb_warning("untrusted? is deprecated and its behavior is same as tainted?");
    return rb_obj_tainted(obj);
}

xmp(exps, bind = nil) Show source

一种便利的方法,只有当您需要IRB :: XMP标准库时才可用。

创建一个新的XMP对象,使用给定的表达式作为exps参数,并可选绑定为bind或使用顶级绑定。然后使用:XMP提示模式评估给定的表达式。

例如:

代码语言:javascript
复制
require 'irb/xmp'
ctx = binding
xmp 'foo = "bar"', ctx
#=> foo = "bar"
  #==>"bar"
ctx.eval 'foo'
#=> "bar"

有关更多信息,请参阅XMP.new。

代码语言:javascript
复制
# File lib/irb/xmp.rb, line 164
def xmp(exps, bind = nil)
  bind = IRB::Frame.top(1) unless bind
  xmp = XMP.new(bind)
  xmp.puts exps
  xmp
end

扫码关注腾讯云开发者

领取腾讯云代金券