ruby049源码分析————array.c

165 篇文章 0 订阅
57 篇文章 0 订阅

ruby049源码分析————array.c
今天在网上都浪费最几个小时,在购物网站上看,一晃几个小时就过去了,真是浪费了时间。
astore(ary,idx,val)
实现的功能是:ary[idx]=val,并且若idx超过数组长度,就自动扩大。
而Fary_push(ary,item)和Fary_append(ary,item)
实现的功能是一样的。
比如
a=[]
a.push(3)
a << 3
这两句话是一样的。
Fary_push,Fary_append都调用了astore,实现了向数组中元素赋值的功能。
Fary_pop(ary)
就是把数组最后一个元素删除。
Fary_shift就是把数组的第一个元素删除。
是利用函数memmove,而没有用for循环,这是一个技巧。
Fary_unshift(ary,item)
把数组向右移动一个位置,再把ary[0]=item加进去。
仍旧是用memmove实现数组数据的移动,很有技巧。

Fary_entry(ary,offset)
是取数组ary[offset]的值,作者需要判断下标是否在区间[0,ary.length-1]区间内,如果offset是负数,就把offset加上长度,这样实现
a[-1]指向数组最后一个元素的功能。
因为-1+a.length==数据最后一个元素的下标。
如果下标不是正常区间内,则返回nil,否则返回ary[offset]

ary_subseq(ary,beg,len)
这个函数很有意思,用一个临时数组,把从ary中取出的子数组放到临时数组中,再把临时数组返回。

Fary_each(ary)
这个函数的逻辑很有意思。
static VALUE
Fary_each(ary)
    struct RArray *ary;
{
    int i;

    if (iterator_p()) {
    for (i=0; i<ary->len; i++) {
        rb_yield(ary->ptr[i]);
    }
    }
    else {
    return (VALUE)ary;
    }
}
我当时的感觉就是这和ruby的写法不是很象吗。
  如果要定义一个带块的函数,如
 def ok
     yield
 end
 ok {puts "okkk"}
我把这个先放下,留待以后再思考。
有很多函数都比较好理解。也有些不好更理解。其实,最后是读最后那段话:
Init_Array()
{
    C_Array  = rb_define_class("Array", C_Object);
    rb_include_module(C_Array, M_Enumerable);

    rb_define_single_method(C_Array, "new", Fary_new, 0);
    rb_define_method(C_Array, "to_s", Fary_to_s, 0);
    rb_define_method(C_Array, "_inspect", Fary_inspect, 0);
    rb_define_method(C_Array, "to_a", Fary_to_a, 0);

    rb_define_method(C_Array, "[]", Fary_aref, -2);
    rb_define_method(C_Array, "[]=", Fary_aset, -2);
    rb_define_method(C_Array, "<<", Fary_append, 1);
    rb_define_method(C_Array, "push", Fary_push, 1);
    rb_define_method(C_Array, "pop", Fary_pop, 0);
    rb_define_method(C_Array, "shift", Fary_shift, 0);
    rb_define_method(C_Array, "unshift", Fary_unshift, 1);
    rb_define_method(C_Array, "each", Fary_each, 0);
    rb_define_method(C_Array, "length", Fary_length, 0);
    rb_define_method(C_Array, "clone", Fary_clone, 0);
    rb_define_method(C_Array, "join", Fary_join, -2);
    rb_define_method(C_Array, "reverse", Fary_reverse, 0);
    rb_define_method(C_Array, "sort", Fary_sort, 0);
    rb_define_method(C_Array, "delete", Fary_delete, 1);
    rb_define_method(C_Array, "delete_if", Fary_delete_if, 0);
    rb_define_method(C_Array, "clear", Fary_clear, 0);
    rb_define_method(C_Array, "fill", Fary_fill, -2);

    rb_define_method(C_Array, "assoc", Fary_assoc, 1);
    rb_define_method(C_Array, "rassoc", Fary_rassoc, 1);

    rb_define_method(C_Array, "+", Fary_plus, 1);
    rb_define_method(C_Array, "*", Fary_times, 1);

    cmp = rb_intern("<=>");
    eq = rb_intern("==");

    rb_define_method(C_Kernel, "::", assoc_new, 1);
}
这段告诉了我们,每个函数与ruby中array对客户展示的函数相对应的东西,为此,先要在irb中,把这些函数弄明白。
再根据理解,有针对性的读代码。这样就理解得更快些。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值