هل هناك طريقة أنظف لكتابة هذا؟ (كتل Ruby/Rails ، قيمة الإرجاع)
-
25-09-2019 - |
سؤال
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 }
لا تنتمي إلى StackOverflow