なひです。

> From: Shin-ichiro HARA [mailto:sinara / blade.nagaokaut.ac.jp] 
> Sent: Monday, February 25, 2002 12:31 PM

> ホントに Struct って使われてないなあ。

パッと見で使いづらい感じがします。なぜでしょう。
newでklassを生成するせいかな?

> で、こんなのが組み込みクラスであったら(Struct と呼べないか
> もしれないが)いいと思いません?

確かにStruct.newは構造体のインスタンスを返してくれたほうが、
newの挙動としては分かり易い気もします。でも、いきなり
インスタンス作る(で、そのインスタンスのクラスのメンバ定義は
忘れちゃう)というのは、いくら分かり易くても、
実際にはあまり使われなさそうな気がします。
小さなプログラムなら便利かな?

	/	/	/

毎度SOAP話ですが、SOAP4Rでは最近、
Structを構造体っぽくmarshallingするのをあきらめました。
確実に元の状態にunmarshalするためには、
いろいろ情報を打ち込まないといけないので。。。
というわけで、CのstructとSOAPでお話ししたい場合、
classを作らないといけません。
ま、こっちのほうが受け入れ易いかな、と。

require 'soap/marshal'

Foo1 = Struct.new( "Foo1", :m )
Foo2 = Struct.new( :m )
class Foo3
  attr_accessor :m
end

puts SOAP::Marshal.marshal( Foo1.new )
puts SOAP::Marshal.marshal( Foo2.new )
puts SOAP::Marshal.marshal( Foo3.new )

p SOAP::Marshal.unmarshal( SOAP::Marshal.marshal( Foo1.new ))
  # => #<Struct::Foo1 m=nil>
p SOAP::Marshal.unmarshal( SOAP::Marshal.marshal( Foo2.new ))
  # => #<Foo2 m=nil>
p SOAP::Marshal.unmarshal( SOAP::Marshal.marshal( Foo3.new ))
  # => #<Foo3:0xa033fc0>

以下、XML記述。

== aFoo1
<Struct..Foo1
  xsi:type="n2:Struct"
  env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:n1="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:n2="http://www.ruby-lang.org/xmlns/ruby/type/1.6">
  <type xsi:type="xsd:string">Struct::Foo1</type>
  <member>
    <m xsi:nil="true"></m>
  </member>
</Struct..Foo1>

== aFoo2
<Foo2
  xsi:type="n2:Struct"
  env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:n1="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:n2="http://www.ruby-lang.org/xmlns/ruby/type/1.6">
<type xsi:type="xsd:string">Foo2</type>
  <member>
    <m xsi:nil="true"></m>
  </member>
</Foo2>

== aFoo3
<Foo3 xsi:type="n2:Foo3"
  env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:n1="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:n2="http://www.ruby-lang.org/xmlns/ruby/type/custom">
</Foo3>