I finally understand instance_eval

I finally understand instance_eval

110cd4dcaed019b3bd9809e541afdeb6?s=128

Masafumi Okura

February 01, 2020
Tweet

Transcript

  1. instance_eval׬શʹཧ ղͨ͠ɿinstance_exec ΋๨ΕΔͳฤ Speaker: େ૔խ࢙ Event: Burikaigi2020 Date: 2020-02-01

  2. self.inspect • ໊લɿେ૔խ࢙ • ॴଐɿϑϦʔϥϯε • Rubyྺɿ໿7೥ • ޷͖ͳΤσΟλɿVim

  3. self.inspect • ࠷ۙͷ՝୊ɿ໊ࢗͱϚελεϥΠυͷσβΠ ϯΛͲ͏͢Δ͔ • झຯɿᘖᘣΛᔸΕΔʢࠓ͸ϑϨϯνϓϨεʣ • ޷͖ͳϝιουɿinstance_eval <- ࠓ೔ͷ࿩

  4. ͸͡Ίʹ

  5. ͜ͷτʔΫʹ͍ͭͯʢϝλʣ • εϥΠυຕ਺ɿ29ຕ • ࣌ؒɿ25෼ • ओͳλʔήοτɿϝλϓϩάϥϛϯάॳ৺ऀ ͔Βதڃऀ • σϞ༗Γ

  6. ·ͣ͸͓͞Β͍

  7. instance_eval ͱ͸ • eval଒ͷ1ͭͰɺ೚ҙͷΦϒδΣΫτ ʢBasicObjectؚΉʣͷίϯςΩετͰจࣈྻ ͷධՁ·ͨ͸ϒϩοΫͷ࣮ߦ͕Մೳ • DSLͷߏஙͳͲʹଟ༻͞ΕΔ • RubyͷॊೈੑΛࢧ͍͑ͯΔʢݸਓͷݟղʣ

  8. ॳֶऀ޲͚ิ଍ɿධՁͬͯʁ • eval଒͸จࣈྻΛRubyͷίʔυʹݟཱ࣮ͯͯ ߦ͢Δ • irb͕΍͍ͬͯΔ͜ͱɺͱ͍͏ͱΠϝʔδ͠΍ ͍͔͢΋ • ධՁ͸ӳޠͰevaluationͳͷͰॖΊͯeval

  9. ॳֶऀ޲͚ิ଍ɿϒϩοΫ • ϒϩοΫͷதͷίʔυ͸͙͢ʹ͸࣮ߦ͞Εͳ ͍ʢίʔϧόοΫ͞ΕΔɺͱ΋ݴ͏ʣ • ϒϩοΫ͸ͦͷ··Ͱ͸ม਺୅ೖͰ͖ͳ͍ ͕ɺ&blockͳͲͰड͚ͨ΋ͷ͸୅ೖՄೳ • ϒϩοΫΛݺͼग़͢ʢcallͱ͔yieldͱ͔ʣͱ ͖ɺҾ਺Λ౉͢ͱͦΕ͕ϒϩοΫҾ਺ʹͳΔ

  10. instance_evalͱଞͷeval଒͸ Ͳ͏ҧ͏ͷ͔ • eval͸จࣈྻ͔͠ධՁͰ͖ͳ͍ʢϒϩοΫΛ࣮ ߦͰ͖ͳ͍ʣ • class_eval͸ධՁͷίϯςΩετ͕ҧ͏ • ʢeval଒Ͱ͸ͳ͍͚Ͳʣinstance_exec͸จࣈྻ ͷධՁ͕Ͱ͖ͳ͍ʢϒϩοΫͷ࣮ߦ͔͠Ͱ͖ͳ

    ͍ʣɺϒϩοΫҾ਺͕౉ͤΔ
  11. σϞͱ͍͏͔؆୯ͳ࢖͍ํ

  12. σϞ͔ΒΘ͔Δ͜ͱ • instance_evalʹ౉ͨ͠ϒϩοΫ಺Ͱ͸self͸Ϩ γʔόΛࢦ͍ͯ͠Δ • ͳͷͰɺϒϩοΫ಺ͰselfΛলུ͢ΔͱϨγʔό ͷϝιου͕ݺ΂Δ • self͕লུͰ͖ΔͷͰϓϥΠϕʔτϝιου΋Π ϯελϯεม਺΋ΞΫηε͠์୊

  13. ެࣜυΩϡϝϯτΛಡΉ

  14. ެࣜυΩϡϝϯτΛಡΉ • https://docs.ruby-lang.org/en/2.7.0/ BasicObject.html#method-i-instance_eval • https://docs.ruby-lang.org/ja/2.7.0/class/ BasicObject.html#I_INSTANCE_EVAL • ༨ஊͳ͕Βɺinstance_eval͸BasicObjectʹੜ ͍͑ͯΔ

  15. ཁ͢ΔʹԿ͕ॻ͍ͯ͋Δͷ͔ • จࣈྻΛड͚Δͱ͖ͱϒϩοΫΛड͚Δͱ͖ ͱͰڍಈ͕ҧ͏ʢ౰ͨΓલʣ • จࣈྻΛड͚Δͱ͖͸جຊతʹevalͱಉ͡ಈ ͖Λ͢Δ • ϒϩοΫΛड͚Δͱ͖͸ϒϩοΫΛ࣮ߦ͢Δ ࡍʹϒϩοΫҾ਺ʹϨγʔόΛ౉͢

  16. ॏཁͳ͜ͱ • ϒϩοΫʹҾ਺Λ౉ͤͳ͍ • ϒϩοΫʹҾ਺Λ౉ͤͳ͍ <-େࣄͳ͜ͱ • DSLΛߏங͢Δࡍʹ࢖͍ͮΒ͍ͱ͖͕͋Δ

  17. ࣮ྫ

  18. ࣮ྫσϞ͔ΒΘ͔ͬͨ͜ͱ • instance_evalͱinstance_exec͸ڍಈ͕ҟͳ Γɺ༻్΋·ͨҟͳΔ • instance_exec͸ड͚ͨϒϩοΫͷҾ਺ʹ೚ҙͷ ΦϒδΣΫτΛ౉ͤΔ • ϒϩοΫΛ࣮ߦ͢Δ͚ͩͳΒinstance_execͷ΄ ͏͕͍͍ͷ͔΋ʁ

  19. ͪΐͬͱ͓΋͠Ζ͍࿩

  20. ಛҟʢγϯάϧτϯʣϝιου • Πϯελϯεʹ͔͠ఆٛ͞Ε͍ͯͳ͍ϝιο υ • instance_evalΛ࢖͏ͱେྔੜ੒͕؆୯ • ࣮͸Ϋϥεϝιουͱݺ͹Ε͍ͯΔ΋ͷ͸͜ ͷҰछ

  21. ಛҟϝιουΛੜ΍ͯ͠ΈΔ

  22. instance_eval಺Ͱdef͕ݺ΂Δ • Կ͕ى͖͍ͯΔͷͩΖ͏͔ • ͦͷṖΛ໌Β͔ʹ͢΂͘ɺզʑ͸RubyͷԞ஍ ʢιʔείʔυʣ΁ͱཱཱྀͬͨ…

  23. RubyͷιʔείʔυΛಡΉ

  24. ιʔείʔυ͔ΒΘ͔Δ͜ͱ • CݴޠͰॻ͍ͯ͋ΔʢͦΕ͸ͦ͏ʣ • vm_eval.cͱ͍͏ϑΝΠϧʹinstance_evalͷ࣮ ૷͕͋Δ • execution_contextͱ͍͏ͷ͕ॏཁͦ͏

  25. ೉͍͠

  26. RubiniusΛಡΜͰΈΔ

  27. Rubiniusͷinstance_evalΑΓ • RubyͷϒϩοΫ࣮ߦʹ͓͍ͯείʔϓ͸ඇৗ ʹॏཁʢʰϝλϓϩάϥϛϯάRubyʱಡ΋ ͏ʣ • CRubyͱಡΈൺ΂Δͱ͍͍͔΋

  28. ·ͱΊ

  29. instance_evalָ͍͠