يمكن العائد طريقة روبي باعتباره مكرر أو بإرجاع مجموعة اعتمادا على السياق؟
-
20-08-2019 - |
سؤال
ولدي طريقة التعسفي في روبي التي تعطي قيم متعددة بحيث يمكن تسليمها للكتلة:
def arbitrary
yield 1
yield 2
yield 3
yield 4
end
arbitrary { |x| puts x }
وأود أن تعديل هذه الطريقة بحيث، إذا لم يكن هناك كتلة، انها مجرد إرجاع القيم كما صفيف. ولذلك فإن هذا التصور ستعمل أيضا:
myarray = arbitrary
p a -----> [1, 2, 3, 4, 5]
هل هذا ممكن في روبي؟
المحلول
وهناك بناء الجملة من أجل ما يلي:
def arbitrary(&block)
values = [1, 2, 3, 4]
if block
values.each do |v|
yield v
end
else
values
end
end
ملاحظة:
yield v
ويمكن الاستعاضة عنها:
block.call v
نصائح أخرى
def arbitrary
values = [1,2,3,4]
return values unless block_given?
values.each { |val| yield(val) }
end
arbitrary { |x| puts x }
arbitrary
في روبي 1.9+ يمكنك استخدام عداد لتنفيذ ذلك.
def arbitrary(&block)
Enumerator.new do |y|
values = [1,2,3,4]
values.each { |val| y.yield(val) }
end.each(&block)
end
ولديه ميزة أنه يعمل لتيارات لا حصر له أيضا:
# block-only version
#
def natural_numbers
0.upto(1/0.0) { |x| yield x }
end
# returning an enumerator when no block is given
#
def natural_numbers(&block)
Enumerator.new do |y|
0.upto(1/0.0) { |x| y.yield(x) }
end.each(&block)
end
ولكن الطريقة الأكثر الاصطلاحية للقيام بذلك هو لحراسة طريقتك مع <لأ href = "http://ruby-doc.org/core-2.2.1/Object.html#method-i-to_enum" يختلط = "noreferrer"> to_enum(your_method_name, your_args)
مثل ذلك:
def arbitrary
return to_enum(:arbitrary) unless block_given?
yield 1
yield 2
yield 3
yield 4
end
وهذا هو المصطلح الذي المكتبات روبي الأساسية نفسها تستخدم في أماكن متعددة.
لا تنتمي إلى StackOverflow