新手问题 请问 P 这个方法的讲解哪里有?

wzhang1987 · 2013年01月18日 · 最后由 wzhang1987 回复于 2013年01月18日 · 2279 次阅读

p( [ anObject ]+ ) -> nil For each object, directly writes anObject.inspect followed by the current output record separator to the program's standard output. p bypasses the Ruby I/O libraries. p self produces: main

除了以上的有更详细的方法讲解吗?

http://apidock.com/ruby/Kernel/p 下面还有源码,更多就是翻 ruby 源码了。

#1 楼 @Rei 那请问 p Obj 和 p Obj.inspect 有什么区别呢?

#2 楼 @wzhang1987

void
rb_p(VALUE obj) /* for debug print within C code */
{
    VALUE str = rb_obj_as_string(rb_inspect(obj)); // 将对象转换为字符串
    if (TYPE(rb_stdout) == T_FILE &&
        rb_method_basic_definition_p(CLASS_OF(rb_stdout), id_write)) {
        io_write(rb_stdout, str, 1);
        io_write(rb_stdout, rb_default_rs, 0);
    }
    else {
        rb_io_write(rb_stdout, str);
        rb_io_write(rb_stdout, rb_default_rs);
    }
}

VALUE
rb_obj_as_string(VALUE obj)
{
    VALUE str;

    if (TYPE(obj) == T_STRING) { // 如果已经是字符串就直接返回
    return obj;
    }
    str = rb_funcall(obj, id_to_s, 0);
    if (TYPE(str) != T_STRING)
    return rb_any_to_s(obj);
    if (OBJ_TAINTED(obj)) OBJ_TAINT(str);
    return str;
}

p Obj 和 p Obj.inspect 区别是前面如果不是 String,就会调用 to_s 后输出,后面已经是 String 了,就直接输出

有刨根问底的精神就动手看源码的同学。

更正一下

rb_obj_as_string(rb_inspect(obj)) // 没看到中间先调用了 rb_inspect

所以 p Obj 和 p Obj.inspect 区别是相当于输出 Obj.inspect 和 Obj.inspect.inspect 的区别。

其实 p Obj 就是原样输出,p Obj.inspect 就是强制转换成 to_s 后输出

需要 登录 后方可回复, 如果你还没有账号请 注册新账号