المعامل []‎ الخاص بالصنف Thread في روبي

من موسوعة حسوب
< Ruby‏ | 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 أو ينشئها.

مصادر