لماذا يمكن استدعاء procs باستخدام === في روبي 1.9؟
-
12-12-2019 - |
سؤال
هذا المقال يذكر 4 طرق لاستدعاء procs في روبي 1.9، و=== واحدة منها.لا أفهم لماذا يتم ذلك بهذه الطريقة على الإطلاق.هل لها أي علاقة بالمعنى الطبيعي لـ === (السؤال عما إذا كان الكائنان هما نفس الكائن)؟
irb(main):010:0> f =-> n {[:hello, n]} => # irb(main):011:0> f.call(:hello) => [:hello, :hello] irb(main):012:0> f === :hello => [:hello, :hello] irb(main):013:0> Object.new === Object.new => false irb(main):014:0> f === f => [:hello, #]
المحلول
هذا ما يجب أن تقوله المستندات:
إنه السماح لكائن proc بأن يكون هدفًا له
when
بند في بيان الحالة.
وهذا مثال ربما مفتعل:
even = proc { |x| x % 2 == 0 }
n = 3
case n
when even
puts "even!"
else
puts "odd!"
end
إنه يعمل لأن case/when
يتم تنفيذه بشكل أساسي مثل هذا:
if even === n
puts "even!"
else
puts "odd!"
end
ال case/when
يتحقق من الفرع الذي سيتم تنفيذه عن طريق الاتصال ===
على الحجج ل when
العبارات، واختيار الأول الذي يُرجع قيمة صحيحة.
بالرغم من تشابهه مع عامل المساواة (==
) ليس شكلاً أقوى أو أضعف منه.أحاول أن أفكر في ===
المشغل باعتباره المشغل "ينتمي إلى". Class
يحدده بحيث يمكنك التحقق مما إذا كان هناك كائن ينتمي إلى الصف (أيهو مثيل للفئة أو فئة فرعية من الفئة)، Range
يحددها للتحقق مما إذا كانت الوسيطة ينتمي إلى النطاق (أيمتضمن في النطاق)، وما إلى ذلك.هذا لا يجعل حقا Proc
تبدو الحالة أكثر منطقية، لكن فكر فيها كأداة لصنع حالتك الخاصة ينتمي إلى المشغلين، مثل المثال أعلاه؛لقد حددت كائنًا يمكنه تحديد ما إذا كان هناك شيء ما ينتمي إلى مجموعة الأعداد الزوجية.
نصائح أخرى
لاحظ أن ===
في روبي لا يتعلق الأمر بالمساواة، على عكس JavaScript.يتم استخدامه على وجه التحديد للتعبيرات الحالة:
case cats.length
when 42 # Uses 42 === cats.length
puts :uh
when /cool/i # Uses /cool/i === cats.length
puts :oh
when ->(n){ n.odd? || n/3==6 } # Passes cats.length to the proc
puts :my
end
هذه الميزة مفيدة في بناء الحالة، عندما تحتاج إلى حساب شيء ما في المقارنة.
giveacodicetagpre.هل لها أي علاقة بالمعنى الطبيعي لـ === (السؤال عما إذا كان الكائنان هما نفس الكائن)؟
في الواقع، هذا مفهوم خاطئ شائع حول ===
في روبي.انها في الواقع ليست صارمة ل Object#object_id
المقارنة (على الرغم من أن هذا هو سلوكها في العديد من الدعوات الشائعة).في روبي، ===
هو الحال الدمج.
وإليكم الوصف ===
من Object
:"المساواة في الحالة - بالنسبة لكائن الفئة ، وفعالية مثل الاتصال #== ، ولكن عادة ما يتم تجاوزها من قبل أحفاد لتوفير دلالات ذات معنى في بيانات الحالات."
للأسف، على الرغم من أنها تتألف من ثلاثة =
, ، ليس لها أي علاقة ولو عن بعد بالمساواة :-D