2011年10月 4日

[ruby-list:48438] Re: WEBrick

出沢です

File.join での話と、一般的な 引数の「配列に * を付けた意味」が
一緒くたに語られている様に思います。

「配列に * を付けた」ものは、[ruby-list:48432]できしもとさんが述べて
いるように、要素にばらしてmethodに渡します。

File.join はマニュアルによれば  join(*item) -> String
ということで、引数に「文字列。何個有ってもよい」を期待している様ですが、
試してみると「文字列の配列」で与えても期待通りの結果が返りますね。

これはおそらく File.join が「引数が配列だったら flatten してから使う」
としてくれているのだとおもいます。
  (Array.joinが flattenして to_s してるみたいにも思える)

このようなことをしてくれない method の場合は *配列 を期待しているときに
配列を渡すと何が起きるかは method 次第、ということになります。

(2011年10月04日 10:41), 牛坂 博則 wrote:
> [ruby-list:48432] を読みました。
> *を仮引数につけて配列をバラスのであれば、以下のように逆になるのでは。
> -----------------------------------------
> すなわち、
> File.join( document_root, req.path.split( '/' ) )
> は
> ( [ document_root ] + req.path.split( '/' ) ).join( File::SEPARATOR ) # (1)
> と同じであり、また
> File.join( document_root, *req.path.split( '/' ) )
> は
> [ document_root, req.path.split( '/' ) ].join( File::SEPARATOR ) # (2)
>
>
>
>
> (2011/10/03 21:48), Y. Nobuoka wrote:
>> 牛坂さん
>>
>>> 配列要素はreq.pathで持ってきて分割しているので、*はつ けなくてもよい
>>> というこですね。
>> 配列要素を req.path で持ってきて分割しているから * を付けなくても良い、と
>> いうとちょっと違うように思います。
>> きしもとさんが、[ruby-list:48432] において実引数の変数名の前に * を付ける
>> 意味を解説されていますので、今回の場合に * を付けても付けなくても
>> 良い理由を以下に述べておきます。
>>
>> 今回使用している File#join メソッドですが、[1] をみるとわかるように
>> item.join( File::SEPARATOR )
>> と同じ動きをするようです。 (item は仮引数として受け取ったパラメータの配列)
>> すなわち、
>> File.join( document_root, *req.path.split( '/' ) )
>> は
>> ( [ document_root ] + req.path.split( '/' ) ).join( File::SEPARATOR ) # (1)
>> と同じであり、また
>> File.join( document_root, req.path.split( '/' ) )
>> は
>> [ document_root, req.path.split( '/' ) ].join( File::SEPARATOR ) # (2)
>> と同じ動きになります。
>> そして、Array#join メソッドは 『要素がまた配列であれば再帰的に (同じ sep を利用して)
>> join した文字列を連結』 する [2] ものなので、(1) の式も (2) の式も結果としては
>> 同じ文字列を返します。
>> よって今回の場合は * があってもなくても同じ動きになります。
>> 一般的なメソッドの場合は、* の有る無しに意味がありますのでご注意ください。
>>
>> [1] http://doc.okkez.net/static/192/class/File.html
>> [2] http://www.ruby-lang.org/ja/old-man/html/Array.html#join
>>
>
>

投稿者 xml-rpc : 2011年10月 4日 11:39
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/106661
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。