Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

͸͡Ίʹ

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

·ͣ͸͓͞Β͍

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

σϞͱ͍͏͔؆୯ͳ࢖͍ํ

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

ެࣜυΩϡϝϯτΛಡΉ

Slide 14

Slide 14 text

ެࣜυΩϡϝϯτΛಡΉ • 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ʹੜ ͍͑ͯΔ

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

࣮ྫ

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

ͪΐͬͱ͓΋͠Ζ͍࿩

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

RubyͷιʔείʔυΛಡΉ

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

೉͍͠

Slide 26

Slide 26 text

RubiniusΛಡΜͰΈΔ

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

·ͱΊ

Slide 29

Slide 29 text

instance_evalָ͍͠