لماذا يمكن استدعاء procs باستخدام === في روبي 1.9؟

StackOverflow https://stackoverflow.com//questions/9674749

  •  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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top