2016-01-21 173 views
2

在擴展到陣列類(軌道/的ActiveSupport/LIB/active_support/core_ext /陣列/ access.rb)以下函數定義:Ruby on Rails的 - 的ActiveSupport:數組擴展

# Returns the beginning of the array up to +position+. 
def to(position) 
    if position >= 0 
    take position + 1 
    else 
    self[0..position] 
    end 
end 

爲什麼它是這樣定義的?爲什麼我們不能只是做:

def to(position) 
    self[0..position] 
end 
+3

https://github.com/rails/rails/commit/ed03d4eaa89a7b4ab09e7f5da76b522d04650daf – bjhaid

回答

3

按照commit message of the change in the Rails code,它看起來像他們正在努力「避免創建範圍的對象」。

當我做arr[0..3]時,0..3部分變成Range對象,然後用它來計算子陣列。我猜他們試圖通過避免這種方式來節省內存。

1

這是關於效率。由於大多數的使用情況下(正參數)將陷入if分支和Array#take方法容易給回報,看到實現:

   static VALUE 
rb_ary_take(VALUE obj, VALUE n) 
{ 
    long len = NUM2LONG(n); 
    if (len < 0) { 
     # does not take negative parameter 
     rb_raise(rb_eArgError, "attempt to take negative size"); 
    } 
    return rb_ary_subseq(obj, 0, len); 
} 

對於else分公司,我們必須創建以來Array#take一個響對象不拿一個負面的參數(見上面的c實現),因此使用更多的內存。