سؤال

وأنا عادة لا شيء من هذا القبيل

array.sort{|a,b| a.something <=> b.something}

وكيف يجب أن جفف هذا؟

هل كانت مفيدة؟

المحلول

واستخدام sort_by

وarray.sort_by{|e| e.something}

أو

sort_lambda = lambda{|e| e.something}
array.sort_by(&sort_lambda)

مع هذا الأخير يمكنك إعادة sort_lambda في تصريحات sort_by أخرى

نصائح أخرى

في القضبان، أو بالأحرى مع ActiveSupport، أو في روبي 1.9 (ربما 1.8.7، ولست متأكدا) يمكنك استخدام قطع قصيرة جديدة تكون السبب:

array.sort_by(&:something)

لاحظ أن sort_by ديه ربما باهظة الثمن (وربما من المفيد: ذلك يعتمد على نوع الرئيسية تعقيد) الآثار الجانبية: فهو يولد ويخزن زوج المفاتيح ذات قيمة مؤقت لكل عنصر بحيث يمكن فرز بواسطة المفتاح الجديد. انظر المناقشة في في وثائق للحصول على مزيد من المعلومات حول هذا الأمر.

و+1 لكلا من الاقتراحات Eimantas، لكني غالبا ما يكون هذا الخروج في الحالات التي يكون فيها لدي فئة مخصصة أن <م> دائما أنواع بهذه الطريقة، مثل الالبومات التي يجب فرز لا تتأثر بحالة الأحرف، وتجاهل الرائدة علامات الترقيم و/ أ / و. لذلك استخدام انها اكثر كفاءة لحساب قيمة النوع مرة واحدة، ومن ثم إعادة تعريف <=> وفقا لذلك. منها مثلا:

class Album
 def sort_value
    @sv ||= @name.downcase.sub(/^\W*(the|an|a) /,"")
  end

  def <=>(other)
    sort_value <=> (other.sort_value rescue other)
  end
end

هل تعتبر بما في ذلك للمقارنة في فئة أ و ب، وفقط يدعو النوع؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top