2013-05-15 8 views
18
बनाम सीमा लो

मान लीजिए आप रेल में वस्तुओं की एक सरणी है @objectsसरणी: बनाम पहले

मैं पहली बार 5 वस्तुओं को प्रदर्शित करना चाहते हैं, तो का उपयोग कर के बीच अंतर क्या है:

  1. @objects.limit(5)
  2. @objects.take(5)
  3. @objects.first(5)

मैं फ्रंट एंड (रूबी), एसक्यूएल के बारे में बात नहीं कर रहा हूं। एसक्यूएल में ऑब्जेक्ट्स सीमित नहीं होने का कारण यह है कि उसी सरणी को इसके लिए सीमा लागू किए बिना कहीं और इस्तेमाल किया जा सकता है।

क्या ऑब्जेक्ट इंस्टेंटेशन के साथ इसका कोई संबंध नहीं है?

+1

क्या आप निश्चित हैं कि @objects एक ऐरे है? मैंने कभी #limit विधि के बारे में नहीं सुना है। # सबसे पहले हालांकि पहले तत्व को वापस करने के लिए एक मानक तरीका है। # टेक भी एक विधि है। – seand

+0

हां '@ ऑब्जेक्ट्स 'एक सरणी है। मैंने '# सीमा' विधि लागू की और ऐसा लगता है कि यह वही कार्य' # टेक' और '# पहला' के रूप में किया गया है। (दृश्य में नियंत्रक नहीं)। – Prem

+1

@objects शायद एक सरणी नहीं बल्कि एक ActiveRecord संबंध है। यही कारण है कि आप सीमा का उपयोग (5) काम कर रहे हैं। –

उत्तर

24
  1. सीमा एक सरणी विधि
  2. ले एक बहस की आवश्यकता है नहीं है, सरणी खाली होने पर यह एक खाली सरणी देता है।
  3. पहले तर्क के बिना बुलाया जा सकता है; यदि सरणी खाली है और तर्क अनुपस्थित है तो यह शून्य लौटाता है।

2,0 के लिए स्रोत ले

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

2,0 पहले के लिए स्रोत:

   static VALUE 
rb_ary_first(int argc, VALUE *argv, VALUE ary) 
{ 
    if (argc == 0) { 
     if (RARRAY_LEN(ary) == 0) return Qnil; 
     return RARRAY_PTR(ary)[0]; 
    } 
    else { 
     return ary_take_first_or_last(argc, argv, ary, ARY_TAKE_FIRST); 
    } 
} 

रेल के संदर्भ में:

  1. limit(5) होगा एक limit(5) का दायरा ActiveRecord::Relation पर दायरा। इसे किसी सरणी पर नहीं कहा जा सकता है, इसलिए limit(5).limit(4) विफल हो जाएगा।

  2. first(5)limit(5) का दायरा ActiveRecord::Relation पर जोड़ देगा। इसे एरे पर भी कहा जा सकता है, इसलिए .first(4).first(3).limit(4).first(3) जैसा ही होगा।

  3. take(5), वर्तमान क्षेत्र में जिज्ञासा चलाएगा सभी वस्तुओं का निर्माण और लौट पहले 5. यह केवल सरणियों पर काम करता है, इसलिए Model.take(5) काम नहीं करेगा, हालांकि अन्य दो काम करेंगे।

+0

क्या आप वाकई '# सीमा' सरणी विधि नहीं है? मैंने इसे ऑब्जेक्ट सरणी '@ ऑब्जेक्ट्स' पर एक दृश्य पर लागू किया और यह वही कार्य '# टेक' और' # पहले' के रूप में किया।'# पहला 'एक तर्क (वैकल्पिक) ले सकता है। इसे अपने आप आज़माएं – Prem

+0

हां, रेल के संदर्भ में संपादन देखें। –

+0

'ले()' को तर्क के बिना बुलाया जा सकता है। – 0112

संबंधित मुद्दे