Issue #7575 has been reported by tadf (tadayoshi funaba). ---------------------------------------- Bug #7575: Struct のメンバーをアクセサで参照できない事がある https://bugs.ruby-lang.org/issues/7575 Author: tadf (tadayoshi funaba) Status: Open Priority: Low Assignee: Category: core Target version: 2.0.0 ruby -v: ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux] Struct のメンバーをアクセサで参照できない事がある。 $ ruby -v -e 'Foo = Struct.new("Foo", "a", "b\000"); foo = Foo.new(1,2); p foo.send("a"); p foo.send("b\000")' ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux] 1 -e:1:in `<main>': undefined method `b' for #<struct Struct::Foo a=1, :"b\x00"=2> (NoMethodError) $ ruby -v -r ostruct -e 'foo = OpenStruct.new("a"=>1, "b\000"=>2); p foo.send("a"); p foo.send("b\000")' ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux] 1 2
on 2012-12-16 11:14
on 2012-12-18 03:59
Issue #7575 has been updated by Glass_saga (Masaki Matsushita).
調べてみましたが、"b\000"をinternするとID_JUNKなIDになってしまう為に、make_struct()で"b\000"に対応するメソッドが定義されないようです。
"b\000"にはis_identchar()でない文字が含まれているので、internするとjunkであると判定されます。
従って、internするとjunkなIDとなるような名前のメンバの存在を許すかどうかという問題だと思われます。
ちなみにdefine_methodでは、junkな名前のメソッドの定義を許しているようです。
class Foo
define_method("foo@") { p 1 }
define_method("foo\000") { p 2 }
end
f = Foo.new
f.send("foo@") #=> 1
f.send("foo\000") #=> 2
----------------------------------------
Bug #7575: Struct のメンバーをアクセサで参照できない事がある
https://bugs.ruby-lang.org/issues/7575#change-34816
Author: tadf (tadayoshi funaba)
Status: Open
Priority: Low
Assignee:
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]
Struct のメンバーをアクセサで参照できない事がある。
$ ruby -v -e 'Foo = Struct.new("Foo", "a", "b\000"); foo = Foo.new(1,2);
p foo.send("a"); p foo.send("b\000")'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]
1
-e:1:in `<main>': undefined method `b' for #<struct Struct::Foo a=1,
:"b\x00"=2> (NoMethodError)
$ ruby -v -r ostruct -e 'foo = OpenStruct.new("a"=>1, "b\000"=>2); p
foo.send("a"); p foo.send("b\000")'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]
1
2
on 2012-12-18 04:58
$B$^$D$b$H(B $B$f$-$R$m$G$9(B
In message "Re: [ruby-dev:46756] [ruby-trunk - Bug #7575] Struct
$B$N%a%s%P!<$r%"%/%;%5$G;2>H$G$-$J$$;v$,$"$k(B"
on Tue, 18 Dec 2012 11:58:51 +0900, "Glass_saga (Masaki Matsushita)"
<glass.saga@gmail.com> writes:
|$BD4$Y$F$_$^$7$?$,!"(B"b\000"$B$r(Bintern$B$9$k$H(BID_JUNK$B$J(BID$B$K$J$C$F$7$^$&0Y$K!"(Bmake_struct()$B$G(B"b\000"$B$KBP1~$9$k%a%=%C%I$,Dj5A$5$l$J$$$h$&$G$9!#(B
|"b\000"$B$K$O(Bis_identchar()$B$G$J$$J8;z$,4^$^$l$F$$$k$N$G!"(Bintern$B$9$k$H(Bjunk$B$G$"$k$HH=Dj$5$l$^$9!#(B
|$B=>$C$F!"(Bintern$B$9$k$H(Bjunk$B$J(BID$B$H$J$k$h$&$JL>A0$N%a%s%P$NB8:_$r5v$9$+$I$&$+$H$$$&LdBj$@$H;W$o$l$^$9!#(B
$B5v$7$?$[$&$,NI$$$H;W$&$N$G$9$,!"$J$K$+LdBj$,$"$j$^$7$?$G$7$g$&$+!#(B
|$B$A$J$_$K(Bdefine_method$B$G$O!"(Bjunk$B$JL>A0$N%a%=%C%I$NDj5A$r5v$7$F$$$k$h$&$G$9!#(B
define_method$B$,$G$-$F$$$k$J$iD>@\E*$JLdBj$O$J$$$N$+$J!#(B
on 2012-12-20 14:34
Issue #7575 has been updated by Glass_saga (Masaki Matsushita). File patch.diff added Assignee set to Glass_saga (Masaki Matsushita) 2012年12月18日 12:57 Yukihiro Matsumoto <matz@ruby.or.jp>: > 許したほうが良いと思うのですが、なにか問題がありましたでしょうか。 > > define_methodができているなら直接的な問題はないのかな。 define_methodでのメソッド定義は本当に何でもありなようですが、それで問題が起こっていないのなら大丈夫そうですね。 make_struct()からidのチェックを外したpatchを添付します。 反対がなければコミットしようと思います。 ---------------------------------------- Bug #7575: Struct のメンバーをアクセサで参照できない事がある https://bugs.ruby-lang.org/issues/7575#change-34911 Author: tadf (tadayoshi funaba) Status: Open Priority: Low Assignee: Glass_saga (Masaki Matsushita) Category: core Target version: 2.0.0 ruby -v: ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux] Struct のメンバーをアクセサで参照できない事がある。 $ ruby -v -e 'Foo = Struct.new("Foo", "a", "b\000"); foo = Foo.new(1,2); p foo.send("a"); p foo.send("b\000")' ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux] 1 -e:1:in `<main>': undefined method `b' for #<struct Struct::Foo a=1, :"b\x00"=2> (NoMethodError) $ ruby -v -r ostruct -e 'foo = OpenStruct.new("a"=>1, "b\000"=>2); p foo.send("a"); p foo.send("b\000")' ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux] 1 2
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.