$B$^$D$b$H(B $B$f$-$R$m$G$9(B
$BEZMKF|$N(BRefinement$B2q5D$G=P$?=IBj$K$D$$$F!#(B
$B0J2<$N;EMM8uJd$N$&$A$$$:$l$rA*$V$+$H$$$&OC$G$7$?!#(B
(a) re-open
$B0lEY(Busing$B$5$l$?%b%8%e!<%k(B($B$^$?$O%/%i%9(B)$B$r(Bre-open$B$7$?>l9g!"$=(B
$B$N%b%8%e!<%k(B/$B%/%i%9$NK\BN$G(Brefinement$B$,M-8z$+$I$&$+!#(B
(b) inheritance
using$B$5$l$?%b%8%e!<%k$r(Binclude$B$7$?%/%i%9(B($B$^$?$O%/%i%9(B)$B!"$*$h(B
$B$S(Busing$B$5$l$?%/%i%9$r7Q>5$7$?%/%i%9$NK\BN$G(Brefinement$B$,M-8z$+(B
$B$I$&$+!#(B
$B>e5-!"(B(a),(b)$B$H$b$KDj5A$N;zLL>e(Busing$B$,EP>l$7$J$$6ILL$G!"(B
refinement$B$,M-8z$+$I$&$+$H$$$&H=CG$K$J$j$^$9!#(Busing$B$,L@<(E*(B
$B$KEP>l$7$J$$$N$K5sF0$,JQ2=$9$k$3$H$O:.Mp$r8F$V2DG=@-$,$"$j$^(B
$B$9!#$^$?!"%b%8%e!<%k!&%/%i%9$NDj5A$,%m!<%I$5$l$k=g=x$K$h$C$F!"(B
$B5sF0$,JQ2=$7$F$7$F$7$^$&$3$H$G!“99$J$k:.Mp$N2DG=@-$,$”$j$^$9!#(B
$B$5$i$KL$K8+$($kHO0O$K(Busing$B$,$J$$$3$H$G!":GE,2=$,Fq$7$$$H$$$&(B
$B$3$H$b$"$k$G$7$g$&!#(B
© module_eval
module_eval$B$r;H$C$?%H%j%C%/$O!">>ED$5$s$N(BRubyConf$BH/I=$G$b$"(B
$B$j!"$J$+$J$+6=L#?<$$%F%/%K%C%/$J$N$G$9$,!"$=$N0lJ}!“F1$8%3!<(B
$B%I$,(Brefinement$BM-8z$G8F$S=P$5$l$k$N$+3NDj$G$-$:!”:GE,2=$,Fq$7(B
$B$$>e$K!"%$%s%i%$%s%-%c%C%7%e$HAj@-$,0-$$$H$$$&LdBj$,$"$j$^$9!#(B
$B$A$J$$K8=>u$G$O(B(a),(b),©$B$H$bM-8z$@$,!"(B©$B$K$D$$$F$O%$%s%i(B
$B%$%s%a%=%C%I%-%c%C%7%e$K4XO"$9$k?<9o$J%P%0$,$"$j!"(Br37616$B$G=$(B
$B@5$,;n$$i$l$?$,!"?<9o$JB.EYDc2<LdBj$K$h$j(Brevert$B$5$l$?!"$HG’(B
$B<1$7$F$$$^$9!#9g$C$F$k!)(B
$B$G!"=5Kv$D$i$D$i$H9M$($?$N$G$9$,!"(B
- refinement$B$O%l%-%7%+%k$J$J$K$+$G$O$J$/!"%b%8%e!<%k!&%/%i(B
$B%9$KDI2C$5$l$kB0@-$G$"$k(B
$B$H$$$&E@$r$h$jL@3N$K$7$F!"(B(a),(b)$B$H$b$KM-8z$K$7$h$&$H;W$$$^$9!#(B
©$B$K$D$$$F$OG:$s$@$N$G$9$,!"$+$J$j?<9o$JLdBj$@$H;W$&$N$G!"(B
- module_eval(&b)$B$N7A<0$O6X;_(B($BNc30(B)
- $B$^$?$O(Brefinement$B>uBV$,0[$J$k>uBV$G$N%V%m%C%/$N<B9T$O6X;_(B
$B$N$$$:$l$+$G$O$I$&$@$m$&$+$H;W$C$F$$$^$9!#A0<T$G$"$l$P>>ED%F(B
$B%/%K%C%/$,;H$($J$$$3$H$K$J$k$o$1$G!"8D?ME*$K$O8e<T$rK>$s$G$$(B
$B$^$9$,!“A0<T$G$b;EJ}$,$J$$$H;W$C$F$$$^$9!#>-Mh@)Ls4KOB$N2DG=(B
$B@-$O$”$k$N$G!#(B
$B;D$kLdBj$O(BTwitter$B$G!"$J$+$@$5$s$,;XE&$7$?(Bprepend$B$H(Brefinement
$B$N4X78$G$9!#$D$^$j(B
class B
def foo
p :B
end
end
module A
refine B do
def foo
p [:refine, :A, :B]
end
end
end
module C
def foo
super
p :C
end
end
class B
prepend C
end
module D
using A
B.new.foo # => $B$J$K$,=PNO$5$l$k$+(B
end
$B$H$$$&LdBj$G$9!#A*Br;h$H$7$F$O(B
(1) refine$B$O(Bprepend$B$r4^$a$F$=$N%/%i%9$N%a%=%C%I$r>e=q$-$9$k(B
($B8=>u(B)$B!#$h$C$F=PNO$O(B[:refine, :A, :B]
(2) refine$B$O(Bprepend$B$G=$>~$5$l$kA0$N4pK%a%=%C%I$rCV$-49$($k!#(B
$B$N$$$:$l$+$G$9$,!";d$O$3$l$O(B(1)$B$,K>$^$7$$$H;W$$$^$9!#$D$^$j!"(B
$B%m!<%+%k$N;XDj$G$"$k(Brefinement$B$NJ}$,M%@h$5$l$k$Y$-$@$H;W$&$+(B
$B$i$G$9!#$?$@$7!"(B[ruby-dev:46477]$B$K$"$kC5:w<jK!$NDs0F$G$O!";d(B
$B$,M}2r$9$k8B$j$G$O<+F0E*$K(B(2)$B$N5sF0$K$J$k$N$G!"$=$NJU$O8!F$(B
$B$NM>CO$,$"$k$H;W$$$^$9!#(B
$B$^$D$b$H(B $B$f$-$R$m(B /:|)