Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
I finally understand instance_eval
Masafumi Okura
February 01, 2020
Programming
1
180
I finally understand instance_eval
Masafumi Okura
February 01, 2020
Tweet
Share
More Decks by Masafumi Okura
See All by Masafumi Okura
Next decade of Rails Girls and the community
okuramasafumi
2
190
Comment that actually works
okuramasafumi
1
48
Porting ruby gem to mgem
okuramasafumi
1
46
For no-rush career
okuramasafumi
3
140
A technique to implement DSL in Ruby
okuramasafumi
0
1.1k
Neovim hearts Ruby
okuramasafumi
0
240
Writing simple and easy DSL with Ruby
okuramasafumi
1
85
Control methods like a pro
okuramasafumi
1
440
Guessing the future of Rails from what DHH said
okuramasafumi
3
1.3k
Other Decks in Programming
See All in Programming
What's new in Shopware 6.5
shyim
0
110
Use KMM to call the API of the National Tax Agency
akkeylab
0
300
Showkase、Paparazziを用いたビジュアルリグレッションテストの導入にチャレンジした話 / MoT TechTalk #15
mot_techtalk
0
120
Makuakeの認証基盤とRe-Architectureチーム
bmf_san
0
600
Cloudflare Workersと状態管理
chimame
3
490
Cloudflare WorkersでGoを動かすライブラリを作っている話
syumai
1
320
OSC大阪 パスワード認証は人類には早すぎる ~ IDaaSを使ったソーシャルログインのすすめ ~
authyasan
7
1.5k
Hatena Engineer Seminar #23「新卒研修で気軽に『ありがとう』を伝え合える Slack アプリを開発した話」
slashnephy
0
320
TypeScript 4.9のas const satisfiesが便利
tonkotsuboy_com
9
2.3k
Milestoner
bkuhlmann
1
250
良質な技術記事を量産する秘訣 / #MeetsPro
jnchito
10
3.5k
AWSにおける標的型Bot対策
hacomono
0
420
Featured
See All Featured
Fireside Chat
paigeccino
16
1.8k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
182
15k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
351
21k
Documentation Writing (for coders)
carmenintech
51
2.9k
Fontdeck: Realign not Redesign
paulrobertlloyd
74
4.3k
jQuery: Nuts, Bolts and Bling
dougneiner
57
6.6k
What's new in Ruby 2.0
geeforr
336
30k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
239
19k
Creatively Recalculating Your Daily Design Routine
revolveconf
207
11k
Faster Mobile Websites
deanohume
295
29k
Testing 201, or: Great Expectations
jmmastey
25
5.7k
Ruby is Unlike a Banana
tanoku
93
9.5k
Transcript
instance_evalશʹཧ ղͨ͠ɿinstance_exec ΕΔͳฤ Speaker: େխ࢙ Event: Burikaigi2020 Date: 2020-02-01
self.inspect • ໊લɿେխ࢙ • ॴଐɿϑϦʔϥϯε • Rubyྺɿ7 • ͖ͳΤσΟλɿVim
self.inspect • ࠷ۙͷ՝ɿ໊ͱϚελεϥΠυͷσβΠ ϯΛͲ͏͢Δ͔ • झຯɿᘖᘣΛᔸΕΔʢࠓϑϨϯνϓϨεʣ • ͖ͳϝιουɿinstance_eval <- ࠓͷ
͡Ίʹ
͜ͷτʔΫʹ͍ͭͯʢϝλʣ • εϥΠυຕɿ29ຕ • ࣌ؒɿ25 • ओͳλʔήοτɿϝλϓϩάϥϛϯάॳ৺ऀ ͔Βதڃऀ • σϞ༗Γ
·͓ͣ͞Β͍
instance_eval ͱ • evalͷ1ͭͰɺҙͷΦϒδΣΫτ ʢBasicObjectؚΉʣͷίϯςΩετͰจࣈྻ ͷධՁ·ͨϒϩοΫͷ࣮ߦ͕Մೳ • DSLͷߏஙͳͲʹଟ༻͞ΕΔ • RubyͷॊೈੑΛࢧ͍͑ͯΔʢݸਓͷݟղʣ
ॳֶऀ͚ิɿධՁͬͯʁ • evalจࣈྻΛRubyͷίʔυʹݟཱ࣮ͯͯ ߦ͢Δ • irb͕͍ͬͯΔ͜ͱɺͱ͍͏ͱΠϝʔδ͠ ͍͔͢ • ධՁӳޠͰevaluationͳͷͰॖΊͯeval
ॳֶऀ͚ิɿϒϩοΫ • ϒϩοΫͷதͷίʔυ͙͢ʹ࣮ߦ͞Εͳ ͍ʢίʔϧόοΫ͞ΕΔɺͱݴ͏ʣ • ϒϩοΫͦͷ··ͰมೖͰ͖ͳ͍ ͕ɺ&blockͳͲͰड͚ͨͷೖՄೳ • ϒϩοΫΛݺͼग़͢ʢcallͱ͔yieldͱ͔ʣͱ ͖ɺҾΛ͢ͱͦΕ͕ϒϩοΫҾʹͳΔ
instance_evalͱଞͷeval Ͳ͏ҧ͏ͷ͔ • evalจࣈྻ͔͠ධՁͰ͖ͳ͍ʢϒϩοΫΛ࣮ ߦͰ͖ͳ͍ʣ • class_evalධՁͷίϯςΩετ͕ҧ͏ • ʢevalͰͳ͍͚Ͳʣinstance_execจࣈྻ ͷධՁ͕Ͱ͖ͳ͍ʢϒϩοΫͷ࣮ߦ͔͠Ͱ͖ͳ
͍ʣɺϒϩοΫҾ͕ͤΔ
σϞͱ͍͏͔؆୯ͳ͍ํ
σϞ͔ΒΘ͔Δ͜ͱ • instance_evalʹͨ͠ϒϩοΫͰselfϨ γʔόΛࢦ͍ͯ͠Δ • ͳͷͰɺϒϩοΫͰselfΛলུ͢ΔͱϨγʔό ͷϝιου͕ݺΔ • self͕লུͰ͖ΔͷͰϓϥΠϕʔτϝιουΠ ϯελϯεมΞΫηε͠์
ެࣜυΩϡϝϯτΛಡΉ
ެࣜυΩϡϝϯτΛಡΉ • 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_evalBasicObjectʹੜ ͍͑ͯΔ
ཁ͢ΔʹԿ͕ॻ͍ͯ͋Δͷ͔ • จࣈྻΛड͚Δͱ͖ͱϒϩοΫΛड͚Δͱ͖ ͱͰڍಈ͕ҧ͏ʢͨΓલʣ • จࣈྻΛड͚Δͱ͖جຊతʹevalͱಉ͡ಈ ͖Λ͢Δ • ϒϩοΫΛड͚Δͱ͖ϒϩοΫΛ࣮ߦ͢Δ ࡍʹϒϩοΫҾʹϨγʔόΛ͢
ॏཁͳ͜ͱ • ϒϩοΫʹҾΛͤͳ͍ • ϒϩοΫʹҾΛͤͳ͍ <-େࣄͳ͜ͱ • DSLΛߏங͢Δࡍʹ͍ͮΒ͍ͱ͖͕͋Δ
࣮ྫ
࣮ྫσϞ͔ΒΘ͔ͬͨ͜ͱ • instance_evalͱinstance_execڍಈ͕ҟͳ Γɺ༻్·ͨҟͳΔ • instance_execड͚ͨϒϩοΫͷҾʹҙͷ ΦϒδΣΫτΛͤΔ • ϒϩοΫΛ࣮ߦ͢Δ͚ͩͳΒinstance_execͷ΄ ͏͕͍͍ͷ͔ʁ
ͪΐͬͱ͓͠Ζ͍
ಛҟʢγϯάϧτϯʣϝιου • Πϯελϯεʹ͔͠ఆٛ͞Ε͍ͯͳ͍ϝιο υ • instance_evalΛ͏ͱେྔੜ͕؆୯ • ࣮ΫϥεϝιουͱݺΕ͍ͯΔͷ͜ ͷҰछ
ಛҟϝιουΛੜͯ͠ΈΔ
instance_evalͰdef͕ݺΔ • Կ͕ى͖͍ͯΔͷͩΖ͏͔ • ͦͷṖΛ໌Β͔ʹ͘͢ɺզʑRubyͷԞ ʢιʔείʔυʣͱཱཱྀͬͨ…
RubyͷιʔείʔυΛಡΉ
ιʔείʔυ͔ΒΘ͔Δ͜ͱ • CݴޠͰॻ͍ͯ͋ΔʢͦΕͦ͏ʣ • vm_eval.cͱ͍͏ϑΝΠϧʹinstance_evalͷ࣮ ͕͋Δ • execution_contextͱ͍͏ͷ͕ॏཁͦ͏
͍͠
RubiniusΛಡΜͰΈΔ
Rubiniusͷinstance_evalΑΓ • RubyͷϒϩοΫ࣮ߦʹ͓͍ͯείʔϓඇৗ ʹॏཁʢʰϝλϓϩάϥϛϯάRubyʱಡ ͏ʣ • CRubyͱಡΈൺΔͱ͍͍͔
·ͱΊ
instance_evalָ͍͠