هل هناك طريقة أنظف لكتابة هذا؟ (كتل Ruby/Rails ، قيمة الإرجاع)

StackOverflow https://stackoverflow.com/questions/4008980

سؤال

  def find_users_online(count = 1)        
    users = Array.new
    count.times do 
      users += get_users_online
    end
    users # <==== I want to remove this here
  end  

في الكود أعلاه ، يجب أن يضع متغير "المستخدمين" مرة أخرى في نهاية الوظيفة لإرجاع القيمة الصحيحة (المستخدمين). ولكن هل من الممكن إرجاع كتلة التايمز قيم المستخدمين ويمكنني إزالة "المستخدمين" في نهاية الوظيفة؟

  def find_users_online(count = 1)        
    users = Array.new
    count.times.and_return do # <== something like this
      users += get_users_online
    end
  end  
هل كانت مفيدة؟

المحلول

تحقق من #tap. إنها الطريقة الجديدة التي تُفعل "العودة".

def find_users_online(count = 1)   
  [].tap do |users|
    count.times { users += get_users_online }
  end
end

نصائح أخرى

يعد حل Lavir جيدًا إذا ستعيد Get_users_online نفس القيمة ذات الوقت الذي يطلق عليه. إذا لم يكن كذلك ، فأنت بحاجة إلى شيء مثل هذا:

count.times.map {get_users_online}.flatten

خيار آخر هو عودة الكتلة

  returning(users = Array.new) do |users|
      count.times { users += get_users_online }
  end

ماذا عن

def find_users_online(count = 1)
  (1..count).map{ get_users_online }.flatten
end

?

get_users_online * count

ولكن يجب أن يعيد Get_users_online () نفس القيمة أثناء تنفيذ هذه الوظيفة.

إذا لم تكن هذه حالتك ثم استخدم

(1..count).map { get_users_online }.reduce(:+)

أو استخدام الجوانب:

count.of { get_users_online }.sum

هناك أيضًا طريقة أكثر إثارة للاهتمام:

(1..count).inject(Array.new) { |ignore, users| users + get_users_online }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top