التابع []‎ الخاص بالصنف 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.

انظر أيضا

  • التابع ‎[]=‎‎: معامل تعيين الخاصيات (Attribute Assignment)

مصادر