المعامل []
الخاص بالصنف Thread
في روبي
يعدُّ المعامل []
مرجعًا للخاصيات (Attribute Reference)، إذ يُعيد قيمة متغير محلي الليف fiber) local variable، أو الليف الأصلي للمهمة الفرعية الحالية إن لم يكن المتغير موجودًا داخل ليف) باستخدام إما رمز أو سلسلة نصية. إن لم يكن المتغير المعطى (انظر فقرة البنية العامة) موجودًا، فستعاد nil
.
[
Thread.new { Thread.current["name"] = "A" },
Thread.new { Thread.current[:name] = "B" },
Thread.new { Thread.current["name"] = "C" }
].each do |th|
th.join
puts "#{th.inspect}: #{th[:name]}"
end
هذا سوف ينتج:
#<Thread:0x00000002a54220 dead>: A
#<Thread:0x00000002a541a8 dead>: B
#<Thread:0x00000002a54130 dead>: C
المعاملان []
و []=
ليسا محليَّا المهمة الفرعية (thread-local)، ولكنهما محليا الليف (fiber-local). هذا الارتباك لم يظهر إلا بعد روبي 1.9، حيث ظهرت الألياف لأول مرة. اختارت روبي 1.9 أن تكون التوابع محلية الليف لتوفير الاصطلاح التالي لأجل النطاق الديناميكي (dynamic scope).
def meth(newvalue)
begin
oldvalue = Thread.current[:name]
Thread.current[:name] = newvalue
yield
ensure
Thread.current[:name] = oldvalue
end
end
قد لا يعمل هذا الاصطلاح كنطاق ديناميكي إن كانت التوابع محلية المهمة الفرعية (thread-local)، وقامت كتلة معطاة بتبديل (switches) الليف.
f = Fiber.new {
meth(1) {
Fiber.yield
}
}
meth(2) {
f.resume
}
f.resume
p Thread.current[:name]
#=> nil if fiber-local
#=> 2 if thread-local (The value 2 is leaked to outside of meth method.)
للمتغيرات محلية المهمة الفرعية، يرجى الاطلاع على التابعين thread_variable_get
و thread_variable_set
.
البنية العامة
thr[sym]→ obj or nil
القيمة المعادة
تعاد قيمة متغير محلي الليف (fiber-local variable). وإن لم يكن المتغير موجودًا، فستعاد القيمة nil
.
انظر أيضًا
- المعامل
[]=
: يعيّن عندما يُستدعى بالشكلthr[sym] = obj
قيمة المتغيرsym
محلي الليف (fiber-local variable)، باستخدام إما الرمز أو السلسلة النصيةobj
أو ينشئها.