Ruby中的数组:Take vs Limit vs First

假设您在Rails @objects有一个对象数组

如果我想显示前5个对象,使用时有什么区别:

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

我说的是前端(Ruby),而不是SQL 。 对象不受SQL限制的原因是因为可以在别处使用相同的数组而不对其应用限制。

它与对象实例化有什么关系吗?

  1. limit不是数组方法
  2. 需要一个论点; 如果数组为空,则返回一个空数组。
  3. 首先可以不带参数调用; 如果数组为空且参数不存在,则返回nil。

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); } } 

在Rails方面:

  1. limit(5)limit(5)的范围添加到ActiveRecord::Relation它不能在数组上调用 ,因此limit(5).limit(4)将失败。

  2. first(5)limit(5)的范围添加到ActiveRecord::Relation它也可以在一个数组上调用,所以.limit(4).first(3) .first(4).first(3)将与.limit(4).first(3)

  3. take(5)将在当前作用域中运行查询,构建所有对象并返回第一个5. 它只适用于数组 ,因此Model.take(5)将不起作用,尽管其他两个将起作用。