روبي metaprogramming - كتلة العائد لا تعمل في طريقة إضافتها بشكل حيوي
-
05-07-2019 - |
سؤال
وأنا أعمل على تمديد NotAMock إطار لالإستئصال الأساليب في rspec، و الحصول على بذرة الاستسلام لكتلة الأساليب.
التعليمات البرمجية في هذا جست يعمل تماما عندما كنت رمز ذلك في بلدي (التي تتم المتابعة لتشبه كيف NotAMock طرق بذرة).
ولكن عندما تدمج object.instance_eval ... الشفرة في إطار NotAMock، و "block_given؟" يعود دائما كاذبة وأنا لا يمكن أبدا أن أحصل على العائد للعمل بسبب ذلك. يضاف الطريقة بشكل صحيح، وأستطيع أن استدعاء الأسلوب فافات ... لكنها لن تعترف كتلة أنني تمريرها إلى الأسلوب من NotAMock فافات الإصدار.
لنرى كيف لقد أدرجت هذه الشفرة في إطار NotAMock، انتقل إلى بلدي نسخة من NotAMock والتحقق من "add_hook" طريقة في أساليب خاصة.
وأنا أعلم أن هذا هو الشيء الكثير لنسأل ... أنا على أمل العثور على بعض التوجيهات. انه تم يقود لي المكسرات طوال اليوم.
المحلول 2
وتبين أن المسألة لا علاقة لها رمز أنني مرتبط ... في إطار NotAMock تقوم بعمل بعض طريقة إعادة تعريف إضافية الذي يسبب قضية بلدي. لقد ضاقت هذه القضية وصولا الى خط واحد محدد من التعليمات البرمجية، وأعمل على كيفية إصلاح ذلك الآن.
نصائح أخرى
وأنا لست متأكدا حتى هذا ممكن. Procs الجديدة لا تعترف حتى كتل.
proc = Proc.new do
if block_given?
yield
else
puts "Not in a block"
end
end
proc.call { puts "In a block"} # => puts Not in a block
ويفترض روبي 1.9 للسماح للكتل لاتخاذ وكتلة كمعلمات. ولكن أنا لا أعرف إذا كان من شأنها أن تعمل أو حتى إذا كان سيسمح كتل المشروطة.