[ruby-list:50845] Re: Stringの派生オブジェクトにsubを取った時のインスタンス変数のコピー
From:
MASAKI Haruka <yek@...>
Date:
2019-11-21 17:32:05 UTC
List:
ruby-list #50845
=E6=AD=A3=E6=9C=A8=E3=81=A7=E3=81=99=E3=80=82
String#sub=E3=81=AF=E8=87=AA=E8=BA=AB=E3=82=92=E8=BF=94=E3=81=99=E3=82=8F=
=E3=81=91=E3=81=A7=E3=81=AF=E3=81=82=E3=82=8A=E3=81=BE=E3=81=9B=E3=82=93=E3=
=81=8B=E3=82=89=E3=80=81
=E6=88=BB=E3=82=8A=E5=80=A4=E3=81=A8=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=84=E3=
=82=8B=E3=82=AA=E3=83=96=E3=82=B8=E3=82=A7=E3=82=AF=E3=83=88=E3=81=AFsub=E3=
=82=92=E5=91=BC=E3=81=B3=E5=87=BA=E3=81=97=E3=81=9F=E3=82=AA=E3=83=96=E3=82=
=B8=E3=82=A7=E3=82=AF=E3=83=88=E3=81=A8=E3=81=AF=E5=88=A5=E7=89=A9=E3=81=A7=
=E3=81=99=E3=81=AE=E3=81=A7=E3=80=81
=E3=82=A4=E3=83=B3=E3=82=B9=E3=82=BF=E3=83=B3=E3=82=B9=E5=A4=89=E6=95=B0=E3=
=81=AF=E5=85=B1=E6=9C=89=E3=81=95=E3=82=8C=E3=81=BE=E3=81=9B=E3=82=93=E3=80=
=82
=E3=82=B5=E3=83=96=E3=82=AF=E3=83=A9=E3=82=B9=E3=81=A7=E3=81=AF=E3=81=AA=E3=
=81=8F=E3=80=81=E7=89=B9=E7=95=B0=E3=82=AF=E3=83=A9=E3=82=B9=E3=82=92=E4=BD=
=BF=E3=81=A3=E3=81=9F=E5=A0=B4=E5=90=88=E3=81=A7=E3=82=82=E9=81=95=E3=81=86=
=E3=82=AA=E3=83=96=E3=82=B8=E3=82=A7=E3=82=AF=E3=83=88=E3=81=AA=E3=81=AE=E3=
=81=A7=E3=80=81
=E7=89=B9=E7=95=B0=E3=82=AF=E3=83=A9=E3=82=B9=E3=81=AF=E6=8C=81=E3=81=A3=E3=
=81=A6=E3=81=84=E3=81=AA=E3=81=84=E7=8A=B6=E6=85=8B=E3=81=AB=E3=81=AA=E3=82=
=8A=E3=81=BE=E3=81=99=E3=80=82
#!ruby
str =3D "Hello"
class <<str
@foo =3D "foo"
def foo
@foo
end
end
str.foo # foo
str2 =3D str.sub("foo", "bar")
str2.foo # error
var=E3=81=AE=E5=80=A4=E3=82=92=E7=B6=99=E6=89=BF=E3=81=97=E3=81=9F=E3=81=84=
=E3=81=AA=E3=82=89=E6=AC=A1=E3=81=AE=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=
=82=8B=E3=81=AE=E3=81=AF=E3=81=84=E3=81=8B=E3=81=8C=E3=81=A7=E3=81=97=E3=82=
=87=E3=81=86=E3=80=82
class NString < String
#...
def var=3D(val)
@var =3D val
end
def sub
new_nstr =3D super
new_nstr.var =3D @val
new_nstr
end
end
On Fri, 22 Nov 2019 01:55:42 +0900
Takefumi URA <ura.takefumi@gmail.com> wrote:
> =E6=B5=A6=E3=81=A8=E3=81=84=E3=81=84=E3=81=BE=E3=81=99=E3=80=82
>=20
> String=E3=82=92=E6=B4=BE=E7=94=9F=E3=81=95=E3=81=9B=E3=81=9F=E3=82=AF=E3=
=83=A9=E3=82=B9=E3=81=AE=E3=82=AA=E3=83=96=E3=82=B8=E3=82=A7=E3=82=AF=E3=83=
=88=E3=81=AB=E3=82=A4=E3=83=B3=E3=82=B9=E3=82=BF=E3=83=B3=E3=82=B9=E5=A4=89=
=E6=95=B0=E3=82=92=E8=A8=AD=E5=AE=9A=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F=E3=
=80=82
> =E3=81=93=E3=81=AE=E3=82=AA=E3=83=96=E3=82=B8=E3=82=A7=E3=82=AF=E3=83=88=
=E3=81=ABsub=E3=82=92=E9=81=A9=E7=94=A8=E3=81=97=E3=81=A6=E3=81=A7=E3=81=8D=
=E3=81=9F=E3=82=AA=E3=83=96=E3=82=B8=E3=82=A7=E3=82=AF=E3=83=88=E3=81=AB=E3=
=81=AF=E3=81=9D=E3=81=AE=E3=82=A4=E3=83=B3=E3=82=B9=E3=82=BF=E3=83=B3=E3=82=
=B9
> =E5=A4=89=E6=95=B0=E3=81=8C=E3=82=B3=E3=83=94=E3=83=BC=E3=81=95=E3=82=8C=
=E3=81=A6=E3=81=84=E3=81=BE=E3=81=9B=E3=82=93=E3=81=A7=E3=81=97=E3=81=9F=E3=
=80=82=E4=BB=A5=E4=B8=8B=E3=81=AE=E3=82=88=E3=81=86=E3=81=AA=E6=84=9F=E3=81=
=98=E3=81=A7=E3=81=99=E3=80=82
>=20
>=20
> $ cat test-string.rb
> class NString < String
> def initialize(s)
> @var =3D s.hash # =E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5=E5=80=A4=E3=82=
=92=E5=8F=96=E3=81=A3=E3=81=A6=E3=82=8B=E3=81=AE=E3=81=AF=E7=89=B9=E3=81=AB=
=E6=84=8F=E5=91=B3=E3=81=AF=E3=81=AA=E3=81=84
> super s
> end
>=20
> def inspect
> "#<NString:#{@var}:#{self}>"
> end
> end
>=20
> ns =3D NString.new('abc')
> p ns # =3D> #<NString:val:abc>
> p ns.sub(/a/, 'A') # =3D> #<NString::Abc>
>=20
> $ ruby -v test-string.rb
> ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin18]
> #<NString:3775343761872790250:abc>
> test-string.rb:8: warning: instance variable @var not initialized
> #<NString::Abc>
>=20
> =E3=81=94=E8=A6=A7=E3=81=AE=E9=80=9A=E3=82=8A @var =E3=81=8C=E5=BC=95=E3=
=81=8D=E7=B6=99=E3=81=8C=E3=82=8C=E3=81=A6=E3=81=8A=E3=82=89=E3=81=9A=E5=88=
=9D=E6=9C=9F=E5=8C=96=E3=82=82=E3=81=AA=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=
=E3=81=BE=E3=81=9B=E3=82=93=E3=80=82
> =E3=81=93=E3=81=AE=E3=81=82=E3=81=9F=E3=82=8A=E3=80=81=E3=82=A4=E3=83=B3=
=E3=82=B9=E3=82=BF=E3=83=B3=E3=82=B9=E5=A4=89=E6=95=B0=E3=82=82=E3=82=B1=E3=
=82=A2=E3=81=97=E3=81=A6=E3=81=8F=E3=82=8C=E3=82=8B (sub=E3=81=A7clone=E3=
=81=AA=E3=82=8Adup=E3=81=AA=E3=82=8A=E3=82=84=E3=81=A3=E3=81=A6=E3=82=8B)=20
> =E3=81=AE=E3=81=8B=E3=81=AA=E3=81=A8=E6=80=9D=E3=81=A3=E3=81=A6=E3=81=84=
=E3=81=9F=E3=81=AE=E3=81=A7=E5=B0=91=E3=81=97=E6=84=8F=E5=A4=96=E3=81=A7=E3=
=81=97=E3=81=9F=E3=80=82
>=20
> String=E3=81=AE=E3=82=BD=E3=83=BC=E3=82=B9=E3=82=92=E8=A6=8B=E3=81=A6=E3=
=81=AA=E3=81=84=E3=81=AE=E3=81=A7=E3=81=AA=E3=82=93=E3=81=A8=E3=82=82=E3=81=
=AA=E3=82=93=E3=81=A7=E3=81=99=E3=81=91=E3=81=A9=E3=80=81
> sub=E3=82=92=E5=8F=96=E3=81=A3=E3=81=A6=E6=96=B0=E3=81=9F=E3=81=AA=E3=82=
=AA=E3=83=96=E3=82=B8=E3=82=A7=E3=82=AF=E3=83=88=E3=81=8C=E5=BE=97=E3=82=89=
=E3=82=8C=E3=81=9F=E6=99=82 @var =E3=81=AE=E5=80=A4=E3=82=92=E3=82=B3=E3=83=
=94=E3=83=BC=E3=81=99=E3=82=8B=E3=81=AB=E3=81=AF=E3=81=A9=E3=81=86=E3=81=97=
=E3=81=9F=E3=82=89=E3=82=88=E3=81=84=E3=81=A7=E3=81=97=E3=82=87=E3=81=86=E3=
=81=8B?
>=20
> =E5=88=A5=E8=A7=A3=E3=81=A8=E3=81=97=E3=81=A6sub!=E3=82=92=E4=BD=BF=E3=81=
=A3=E3=81=A6=E3=81=9D=E3=82=82=E3=81=9D=E3=82=82=E3=82=B3=E3=83=94=E3=83=BC=
=E3=81=99=E3=82=8B=E5=BF=85=E8=A6=81=E3=82=92=E3=81=AA=E3=81=8F=E3=81=99=E3=
=81=A8=E3=81=84=E3=81=86=E3=81=AE=E3=81=AF=E3=81=82=E3=82=8B=E3=81=A7=E3=81=
=97=E3=82=87=E3=81=86=E3=81=91=E3=81=A9=20
> (=E3=81=A8=E3=81=84=E3=81=86=E3=81=8B=E3=81=9D=E3=82=8C=E3=81=A7=E3=81=A8=
=E3=82=8A=E3=81=82=E3=81=88=E3=81=9A=E8=A7=A3=E6=B1=BA=E3=81=97=E3=81=BE=E3=
=81=97=E3=81=9F)=E3=80=81=E7=B4=94=E7=B2=8B=E3=81=AB=E7=96=91=E5=95=8F=E3=
=81=AB=E6=80=9D=E3=81=A3=E3=81=9F=E3=81=AE=E3=81=A7=E8=B3=AA=E5=95=8F=E3=81=
=97=E3=81=A6=E3=81=BF=E3=82=8B=E3=81=93=E3=81=A8=E3=81=AB=E3=81=97=E3=81=BE=
=E3=81=97=E3=81=9F=E3=80=82
>=20