<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xml:lang="ja-JP">
  <channel rdf:about="http://yugui.jp/wiki/hiki.cgi?c=rss">
    <title>yugui wiki : Recent Changes</title>
    <link>http://yugui.jp/wiki/hiki.cgi?c=recent</link>
    <description>yugui wiki Recent Changes</description>
    <dc:language>ja</dc:language>
    <dc:rights>Copyright (C) Yugui</dc:rights>
    <dc:date>2011-01-19T08:07:39+00:00</dc:date>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://yugui.jp/wiki/hiki.cgi?FrontPage"/>
        <rdf:li rdf:resource="http://yugui.jp/wiki/hiki.cgi?LearningRuby"/>
        <rdf:li rdf:resource="http://yugui.jp/wiki/hiki.cgi?LearningRuby-GarbageCollection"/>
        <rdf:li rdf:resource="http://yugui.jp/wiki/hiki.cgi?SandBox"/>
        <rdf:li rdf:resource="http://yugui.jp/wiki/hiki.cgi?SideMenu"/>
        <rdf:li rdf:resource="http://yugui.jp/wiki/hiki.cgi?InterWikiName"/>
        <rdf:li rdf:resource="http://yugui.jp/wiki/hiki.cgi?TextFormattingRules"/>
        <rdf:li rdf:resource="http://yugui.jp/wiki/hiki.cgi?About"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://yugui.jp/wiki/hiki.cgi?FrontPage">
    <title>FrontPage</title>
    <link>http://yugui.jp/wiki/hiki.cgi?FrontPage</link>
    <dc:date>2011-01-19T08:07:39+00:00</dc:date>
    <content:encoded><![CDATA[<div>@@&nbsp;-5,5&nbsp;+5,4&nbsp;@@<br>
&nbsp;<br>
&nbsp;==&nbsp;メタコンテンツ<br>
&nbsp;*&nbsp;((&lt;このWikiについて|About&gt;))<br>
-*&nbsp;((&lt;砂場|SandBox&gt;))&nbsp;-&nbsp;編集練習用ページ<br>
-*&nbsp;[Custom&nbsp;Writing|http://www.rushessay.com/custom_essay.php]]&nbsp;Rubyについて。<br>
+*&nbsp;((&lt;砂場|SandBox&gt;))&nbsp;-&nbsp;編集練習用ページ<br>
\&nbsp;No&nbsp;newline&nbsp;at&nbsp;end&nbsp;of&nbsp;file</div>]]></content:encoded>  </item>  <item rdf:about="http://yugui.jp/wiki/hiki.cgi?LearningRuby">
    <title>『初めてのRuby』サポートページ</title>
    <link>http://yugui.jp/wiki/hiki.cgi?LearningRuby</link>
    <dc:date>2010-02-03T10:48:25+00:00</dc:date>
    <content:encoded><![CDATA[<div>他言語プログラマのためのRuby入門書『初めてのRuby』のサポートページです。<br>
別ページにて((<正誤表|"LearningRuby-Errata">))も提供しています。<br>
<br>
== 書誌情報<br>
((<URL:http://yugui.jp/wiki/images/lr-cover.gif>))<br>
* 『..</div>]]></content:encoded>  </item>  <item rdf:about="http://yugui.jp/wiki/hiki.cgi?LearningRuby-GarbageCollection">
    <title>『初めてのRuby』余った切れ端</title>
    <link>http://yugui.jp/wiki/hiki.cgi?LearningRuby-GarbageCollection</link>
    <dc:date>2008-07-02T06:10:30+00:00</dc:date>
    <content:encoded><![CDATA[<div>@@&nbsp;-8,7&nbsp;+8,7&nbsp;@@<br>
&nbsp;<br>
&nbsp;{{hr}}<br>
&nbsp;<br>
-==&nbsp;モジュール<br>
+==&nbsp;モジュール&nbsp;(8章補稿)<br>
&nbsp;Rubyにおけるモジュールとは、(インスタンス)メソッド、クラスメソッド、定数、クラス変数を束ねた寄せ集めである。こうしたいろいろなものを包んでカテゴリ分けに利用するという意味では「モジュール」という名前は分かりやすいものであると思う。<br>
&nbsp;<br>
&nbsp;===&nbsp;名前空間の分離<br>
@@&nbsp;-147,7&nbsp;+147,7&nbsp;@@<br>
&nbsp;<br>
&nbsp;{{hr}}<br>
&nbsp;<br>
-==&nbsp;Rubyの構文<br>
+==&nbsp;Rubyの構文&nbsp;(6章の余り)<br>
&nbsp;これまで、コード例に登場する個々の式の文法規則について細かに説明することはしませんでした。本章ではこの細かい点を掘り下げていきます。<br>
&nbsp;<br>
&nbsp;実際のところ、確かに(({a&nbsp;=&nbsp;1+1}))みたいな文は読者のみなさんには通じるわけですから構わないですよね。不安な式があった場合は本章を読み直した後にもう一度前の部分を読み返すと良いでしょう。<br>
@@&nbsp;-156,7&nbsp;+156,7&nbsp;@@<br>
&nbsp;<br>
&nbsp;{{hr}}<br>
&nbsp;<br>
-==&nbsp;alias<br>
+==&nbsp;alias&nbsp;(7章&nbsp;削除項目)<br>
&nbsp;alias文によってメソッドに「別名」を付けることができます。メソッド本体の定義は共有したままで別の名前でもメソッドを呼び出せるようにします。<br>
&nbsp;<br>
&nbsp;例えば、(({Array#length}))メソッドには(({Array#size}))という別名があります。<br>
@@&nbsp;-172,7&nbsp;+172,7&nbsp;@@<br>
&nbsp;<br>
&nbsp;{{hr}}<br>
&nbsp;<br>
-==&nbsp;初期値<br>
+==&nbsp;初期値&nbsp;(6章&nbsp;余り)<br>
&nbsp;:Column:&nbsp;初期値<br>
&nbsp;&nbsp;&nbsp;インスタンス変数とグローバル変数は、代入されたことがなくても参照することができます。ローカル変数・クラス変数・定数は最初に代入されたときに定義され、それ以前に参照しようとすると(({NameError}))を生じるのとは挙動が異なっています。未初期化状態のインスタンス変数やグローバル変数を評価すると、値は(({nil}))になります。<br>
&nbsp;<br>
@@&nbsp;-194,9&nbsp;+194,77&nbsp;@@<br>
&nbsp;<br>
&nbsp;{{hr}}<br>
&nbsp;<br>
-==&nbsp;メソッド名<br>
+==&nbsp;メソッド名&nbsp;(7章&nbsp;余り)<br>
&nbsp;メソッド名には「ASCII記号」をのぞく任意の印刷可能文字、またはアンダースコア「(({_}))」を用いることができます。ただし、ASCII数字で開始することはできません。例えば、「(({fooAndBar}))」「(({foo_and_bar}))」「(({このメソッドを実行しないでください}))」などは文法上正当なメソッド名です。一方、「(({foo=bar}))」「(({foo[]}))」「(({1st]}))」「(({@ruby-lang.org}))」などは正当なメソッド名ではありません。<br>
&nbsp;<br>
&nbsp;このような名前のメソッドを定義したり呼び出したりしようとすると構文エラーを生じます。正確に言うと、(({Module#define_method}))のような方法で通常の構文解析を回避すればNUL文字を含まないどんな名前でもメソッド名にできます。けれども、通常の方法では呼び出せないので意味は薄いでしょう。HpricotライブラリがXPath式の表現に用いている(({filter[text()=]})),&nbsp;(({filter[@=]}))メソッドは筆者が知る唯一の有意義な例です。<br>
&nbsp;<br>
&nbsp;また、メソッド名に非ASCII文字((-例えば日本語文字-))を用いる際には注意が必要です。Ruby処理系にソースコードの文字エンコーディングを正しく認識させないと構文エラーを引き起こすことでしょう。詳細は4章を参照してください。<br>
+<br>
+==&nbsp;リフレクション&nbsp;(8章補稿)<br>
+再帰的(reflective)なプログラミング((-リフレクション(refelction)-))はRubyにおいてはごく普通のことです。つまり、熟練したRubyプログラマは、数値や文字列を操作するのと同じように当たり前にクラスやメソッドを操作します。ですから、それを黒魔術と呼ぶには抵抗があります。<br>
+<br>
+しかしながら、再帰的プログラミングと黒魔術の組み合わせは最高に効果的でもあります。黒魔術との相性の良さのために、ここで並べて紹介したいと思います。<br>
+<br>
+===&nbsp;send<br>
+(({send}))メソッドは、レシーバに任意のメッセージを送るメソッドです。(({method_missing}))をオーバーライドする際には(({send}))が便利です。<br>
+<br>
+&nbsp;class&nbsp;SimpleDelegator<br>
+&nbsp;&nbsp;&nbsp;def&nbsp;initialize(target);&nbsp;@target&nbsp;=&nbsp;target&nbsp;end<br>
+&nbsp;&nbsp;&nbsp;def&nbsp;method_missing(message,&nbsp;*args)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target.send(message,&nbsp;*args)<br>
+&nbsp;&nbsp;&nbsp;end<br>
+&nbsp;end<br>
+<br>
+(({Object#send}))は、メソッド名を表す文字列またはシンボルを引数に取ります。また、追加でそのメソッドに渡す引数列も付けることができます。つまり、(({send}))を使えば自由なルールで呼び出すべきメソッド名を算出して、呼び出しを行うことができるわけです。<br>
+<br>
+===&nbsp;クラスの定義<br>
+通常の(({class}))式だけでもかなり多くのことができます。これについては1章や8章で既に触れました。(({class}))式は実行時に新しいクラスを定義する式です。代入や算術計算と殆ど代わりのないRubyの式です。そのため、親クラスを状況に応じて定義し分けることも可能ですし、イテレータで制御することすら可能です。<br>
+<br>
+この他に、(({Class.new}))によって匿名のクラスを作成することができます。<br>
+&nbsp;c&nbsp;=&nbsp;Class.new&nbsp;do<br>
+&nbsp;&nbsp;&nbsp;def&nbsp;foo;&nbsp;:foo&nbsp;end<br>
+&nbsp;end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#=&gt;&nbsp;#&lt;Class:0x4ac68&gt;&nbsp;名前のないクラス<br>
+&nbsp;obj&nbsp;=&nbsp;c.new&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#=&gt;&nbsp;#&lt;#&lt;Class:0x4ac68&gt;:0x3a480&gt;&nbsp;そのインスタンス<br>
+&nbsp;obj.foo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#=&gt;&nbsp;:foo<br>
+<br>
+Rubyにおいてはクラスも(({Class}))クラスに属するオブジェクトに過ぎません。ですから、通常のオブジェクトを操作するようにクラスとそのもとのオブジェクトシステム自体を操作できるのです。((-オブジェクトシステムの語彙によってオブジェクトシステムを操作する、というのがこの類の手法が「再帰的(reflective)」と呼ばれる由縁です。-))<br>
+<br>
+===&nbsp;メソッドの定義<br>
+クラスと同様に、メソッド定義にも対応する再帰的APIが存在します。それが(({Module#define_method}))です。<br>
+&nbsp;class&nbsp;Foo<br>
+&nbsp;&nbsp;&nbsp;define_method(:bar)&nbsp;do<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;:bar<br>
+&nbsp;&nbsp;&nbsp;end<br>
+&nbsp;end<br>
+&nbsp;foo&nbsp;=&nbsp;Foo.new<br>
+&nbsp;foo.bar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#=&gt;&nbsp;:bar<br>
+(({define_method}))はブロックを受け取ると、そのブロックをメソッド本体として新しいメソッドを定義します。この他に、(({Proc}))オブジェクトや(({UnboundMethod}))オブジェクトを引数として渡し、メソッド本体として利用させることもできます。<br>
+<br>
+それにしても、この例は(({def}))式と大差ないのであまり面白くありませんね。そこで、こんなことをしてみましょう。<br>
+&nbsp;def&nbsp;make_criable(target,&nbsp;message)<br>
+&nbsp;&nbsp;&nbsp;(class&nbsp;&lt;&lt;&nbsp;target;&nbsp;self&nbsp;end).send(:define_method,&nbsp;:cry)&nbsp;do<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Flow&nbsp;my&nbsp;tears!&nbsp;#{message}&quot;<br>
+&nbsp;&nbsp;&nbsp;end<br>
+&nbsp;end<br>
+<br>
+&nbsp;message&nbsp;=&nbsp;&quot;the&nbsp;Policeman&nbsp;said&quot;<br>
+&nbsp;the_man&nbsp;=&nbsp;Object.new<br>
+&nbsp;make_criable(the_man,&nbsp;message)<br>
+&nbsp;the_man.cry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#=&gt;&nbsp;Flow&nbsp;my&nbsp;tears!&nbsp;the&nbsp;Policeman&nbsp;said<br>
+<br>
+(({make_criable}))は、新しい特異メソッドを与えるメソッドです。(({the_man}))は、(({make_criable}))によって(({cry}))メソッドを獲得しました。<br>
+<br>
+ここで、(({define_method}))の存在意義が発揮されています。(({cry}))メソッドのメソッド本体を作成するに当たり、外側の(({message}))引数を用いているのです。これは普通の(({def}))式ではできない芸当です。<br>
+<br>
+こうして、「コンテキストを保持するメソッド」を作成できます。7章で触れたように、通常のメソッドはクロージャーではありません。一方、ブロックや(({Proc}))オブジェクトは作成されたときのコンテキストを保持しています。これらはクロージャーです。そして、(({define_method}))メソッドにブロックを渡せば、ブロックが参照しているの外部コンテキストは保持したまま、それをメソッドに変換できます。<br>
+<br>
+ですから、もしもコンテキストが保持している(({message}))オブジェクトが変更されれば(({cry}))メソッドの挙動も変化するはずです。<br>
+<br>
+&nbsp;message['Policeman']&nbsp;=&nbsp;'Yapoo'<br>
+&nbsp;the_man.cry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#=&gt;&nbsp;Flow&nbsp;my&nbsp;tears!&nbsp;the&nbsp;Yapoo&nbsp;said<br>
+<br>
+:Column:&nbsp;特異クラスの取り出し<br>
+&nbsp;&nbsp;(({class&nbsp;&lt;&lt;&nbsp;target;&nbsp;self&nbsp;end}))は、オブジェクト(({target}))の特異クラスを取得するためのイディオムです。<br>
+&nbsp;&nbsp;<br>
+&nbsp;&nbsp;実は、オブジェクトから対応する特異クラスを取り出すというメソッドは提供されていないのですね。特異クラス周辺の黒魔術的テクニックをむやみに乱用することがないようにという戒めです。けれどもこうした抜け道はあって、筆者のような「黒魔術」愛好家の間では広く知られています。「好ましくないプログラミングスタイルは難しくなるように。ただし、望むならば不可能ではないように」というRuby設計上の原則から導かれています。</div>]]></content:encoded>  </item>  <item rdf:about="http://yugui.jp/wiki/hiki.cgi?SandBox">
    <title>SandBox</title>
    <link>http://yugui.jp/wiki/hiki.cgi?SandBox</link>
    <dc:date>2008-06-16T07:43:16+00:00</dc:date>
    <content:encoded><![CDATA[<div>@@&nbsp;-1&nbsp;+1,4&nbsp;@@<br>
&nbsp;砂場ですが、それが何か?<br>
+<br>
+あー、こっちで練習するべきだったのか･･･。<br>
+すみません。</div>]]></content:encoded>  </item>  <item rdf:about="http://yugui.jp/wiki/hiki.cgi?SideMenu">
    <title>SideMenu</title>
    <link>http://yugui.jp/wiki/hiki.cgi?SideMenu</link>
    <dc:date>2008-06-12T02:48:49+00:00</dc:date>
    <content:encoded><![CDATA[<div>@@&nbsp;-1,2&nbsp;+1,5&nbsp;@@<br>
+=&nbsp;((&lt;URL:http://yugui.jp/images/yugui-identicon.png:24x24&gt;))&nbsp;((&lt;yugui.jp|URL:http://yugui.jp&gt;))<br>
+((&lt;Wiki&nbsp;FrontPage|FrontPage&gt;))<br>
+<br>
&nbsp;==&nbsp;最近更新されたページ<br>
&nbsp;{{recent(20}}</div>]]></content:encoded>  </item>  <item rdf:about="http://yugui.jp/wiki/hiki.cgi?InterWikiName">
    <title>InterWikiName</title>
    <link>http://yugui.jp/wiki/hiki.cgi?InterWikiName</link>
    <dc:date>2008-06-12T02:46:22+00:00</dc:date>
    <content:encoded><![CDATA[<div>@@&nbsp;-1&nbsp;+1,2&nbsp;@@<br>
&nbsp;[[RWiki|http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=]]&nbsp;euc<br>
+[[ruby-1.9|http://redmine.ruby-lang.org/repositories/entry/ruby-19/]]&nbsp;utf8</div>]]></content:encoded>  </item>  <item rdf:about="http://yugui.jp/wiki/hiki.cgi?TextFormattingRules">
    <title>TextFormattingRules</title>
    <link>http://yugui.jp/wiki/hiki.cgi?TextFormattingRules</link>
    <dc:date>2008-06-11T19:58:46+00:00</dc:date>
    <content:encoded><![CDATA[<div>= rd+ styleの記述方法<br>
ドキュメントはRDで記述します。詳しくは((<RD事始め|URL:http://www.rubyist.net/~rubikitch/computer/rd-intro/>))を参照してください。<br>
<br>
((<RWiki:RDの書き方>))わかりやすいです(他力本願(^^;))。..</div>]]></content:encoded>  </item>  <item rdf:about="http://yugui.jp/wiki/hiki.cgi?About">
    <title>このWikiについて</title>
    <link>http://yugui.jp/wiki/hiki.cgi?About</link>
    <dc:date>2008-06-11T19:50:23+00:00</dc:date>
    <content:encoded><![CDATA[<div>((<Yugui|URL:http://yugui.jp>))が管理しているWikiです。<br>
<br>
殆どのページを誰でも編集できます。Wikiなので。ただ、無関係なページを作るとか悪戯とかはやめてくださいね。<br>
<br>
編集を試してみたい方は((<砂場|SandBox>)..</div>]]></content:encoded>  </item></rdf:RDF>

