<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://www39.atwiki.jp/startruby/">
    <title>Start! Ruby</title>
    <link>http://www39.atwiki.jp/startruby/</link>
    <description>Start! Ruby</description>

    <dc:language>ja</dc:language>
    <dc:date>2010-02-14T18:13:44+09:00</dc:date>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="http://www39.atwiki.jp/startruby/pages/29.html" />
                <rdf:li rdf:resource="http://www39.atwiki.jp/startruby/pages/28.html" />
                <rdf:li rdf:resource="http://www39.atwiki.jp/startruby/pages/1.html" />
                <rdf:li rdf:resource="http://www39.atwiki.jp/startruby/pages/16.html" />
                <rdf:li rdf:resource="http://www39.atwiki.jp/startruby/pages/27.html" />
                <rdf:li rdf:resource="http://www39.atwiki.jp/startruby/pages/23.html" />
                <rdf:li rdf:resource="http://www39.atwiki.jp/startruby/pages/17.html" />
                <rdf:li rdf:resource="http://www39.atwiki.jp/startruby/pages/25.html" />
                <rdf:li rdf:resource="http://www39.atwiki.jp/startruby/pages/26.html" />
                <rdf:li rdf:resource="http://www39.atwiki.jp/startruby/pages/22.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="http://www39.atwiki.jp/startruby/pages/29.html">
    <title>RSpecで宣言的なUnitTest!</title>
    <link>http://www39.atwiki.jp/startruby/pages/29.html</link>
    <description>
      * RSpec で宣言的なUnitTest!

&amp;html(&lt;div style=&quot;width:425px;text-align:left&quot; id=&quot;__ss_3094456&quot;&gt;&lt;a style=&quot;font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/mitim/rspec-3094456&quot; title=&quot;RSpecのここがすごい！&quot;&gt;RSpecのここがすごい！&lt;/a&gt;&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rspecshock-100207033139-phpapp02&amp;stripped_title=rspec-3094456&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rspecshock-100207033139-phpapp02&amp;stripped_title=rspec-3094456&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style=&quot;font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;&quot;&gt;View more &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/mitim&quot;&gt;mitim&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;)


** 目次

-[[RSpecのここがすごい！]]
-[[ブラックボックス？ステートボックス？]]
-[[RSpecのやる事、やらない事]]
-[[RSpecの構文]]
-[[RSpecを実行しよう！]]

----    </description>
    <dc:date>2010-02-14T18:13:44+09:00</dc:date>
  </item>
    <item rdf:about="http://www39.atwiki.jp/startruby/pages/28.html">
    <title>Start! Ruby</title>
    <link>http://www39.atwiki.jp/startruby/pages/28.html</link>
    <description>
      * Start! Ruby

&amp;html(&lt;div style=&quot;width:425px;text-align:left&quot; id=&quot;__ss_3094513&quot;&gt;&lt;a style=&quot;font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/mitim/start-ruby-3094513&quot; title=&quot;Start!! Ruby&quot;&gt;Start!! Ruby&lt;/a&gt;&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=startruby-100207035631-phpapp02&amp;stripped_title=start-ruby-3094513&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=startruby-100207035631-phpapp02&amp;stripped_title=start-ruby-3094513&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style=&quot;font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;&quot;&gt;View more &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/mitim&quot;&gt;mitim&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;)


** 目次

-[[なぜRuby？]]
-[[Smalltalkの思想を模倣した設計思想]]
-[[基本的な構文]]
-[[Rubyらしさ]]
-[[Rubyでもドキュメンテーション]]
-[[これだけは覚えておきたい！コマンド]]
-[[たくさんあるよ！ライブラリ]]
-[[外部リンク]]

----    </description>
    <dc:date>2010-02-14T18:11:46+09:00</dc:date>
  </item>
    <item rdf:about="http://www39.atwiki.jp/startruby/pages/1.html">
    <title>トップページ</title>
    <link>http://www39.atwiki.jp/startruby/pages/1.html</link>
    <description>
      **このWikiについて

LL言語の覇者、Rubyについて、学んだことを掲載していくページです。

** 目次
- [[事前準備]]
-[[Start! Ruby]]
--[[なぜRuby？]]
--[[Smalltalkの思想を模倣した設計思想]]
--[[基本的な構文]]
--[[Rubyらしさ]]
--[[Rubyでもドキュメンテーション]]
--[[これだけは覚えておきたい！コマンド]]
--[[たくさんあるよ！ライブラリ]]
--[[外部リンク]]
-[[RSpecで宣言的なUnitTest!]]
--[[RSpecのここがすごい！]]
--[[ブラックボックス？ステートボックス？]]
--[[RSpecのやる事、やらない事]]
--[[RSpecの構文]]
--[[RSpecを実行しよう！]]
-[[課題！]]

----

**@Wikiについて。
-[[@wikiの基本操作&gt;http://atwiki.jp/guide/category2.html]]
-[[用途別のオススメ機能紹介&gt;http://atwiki.jp/guide/category22.html]]
-[[@wikiの設定/管理&gt;http://atwiki.jp/guide/category6.html]]

-[[@wiki ご利用ガイド&gt;http://atwiki.jp/guide/]]
-[[よくある質問&gt;http://atwiki.jp/guide/category1.html]]
-[[無料で会員登録できるSNS内の@wiki助け合いコミュニティ&gt;http://sns.atfb.jp/view_community2.php?no=112]]
-[[@wiki更新情報&gt;http://www1.atwiki.jp/guide/pages/264.html]]
-[[@wikiへのお問合せフォーム&gt;http://atwiki.jp/helpdesk]]

***@wiki助け合いコミュニティの掲示板スレッド一覧

#atfb_bbs_list(112)    </description>
    <dc:date>2010-02-14T18:07:33+09:00</dc:date>
  </item>
    <item rdf:about="http://www39.atwiki.jp/startruby/pages/16.html">
    <title>基本的な構文</title>
    <link>http://www39.atwiki.jp/startruby/pages/16.html</link>
    <description>
      * 基本的な構文
** 命名規則

: 定数 | 大文字で始まる
: 変数 | 小文字で始まる

*** 慣習

1. クラス名はパスカル記法
 class HogeHoge
2. メソッド名、変数名は_区切りの小文字 
 def hoge_hoge
 hoge_hoge = 0
3. 定数名は_区切りの大文字
 HOGE_HOGE = &quot;hoge&quot;
 
** 変数とシンボル

*** 変数のスコープ

rubyのスコープの思想「最小単位はブロック(not メソッド、not 式)」

rubyの変数の思想「変数のスコープはなるべく局所化しろ」

 hoge
スコープ＝ブロック・ローカル

 @hoge
スコープ＝インスタンス

 @@hoge
スコープ＝クラス

 $hoge
スコープ＝グローバル

*** シンボル

 :hoge
同名の変数に対してリンクを張っている。

** メソッドの定義

引数なし
 def bark
 end

引数あり
 def bark(time)
 end

複数の引数あり、初期化付き
 def bark(time, voice=&quot;ばう&quot;)
 end

可変長引数
 def bark(*voice)
 end

メソッドのスコープは基本的にパブリック

** クラスの定義

 class CurDog &lt;&lt; Dog
   PEDIGREE = &quot;雑種&quot;
  
   attr_reader :name
   def initialize(name)
     @name = name
   end
   
   def bark(voice=&quot;ばう&quot;)
     p voice
   end
   
   def wait
     shit
   end
   
   def self.cute
     p &quot;きゅぅーん&quot;
   end
   
   private :shit
   def shit
     p &quot;ポトリ&quot;
   end
 end

rubyの面白いところ：クラスとは「クラスオブジェクトの定数」にしか過ぎない。

*** クラスオブジェクト？？

クラス定義に従ってインスタンスを生成できる&amp;bold(){インスタンス工場}のこと。

*** ポイント

+ newは特別なメッセージ。メソッドとして独自定義できない。
+ initializeはnewした時に自動で呼ばれるメソッド。引数を加えることができる。
+ 継承したい時は &lt;&lt; [継承元] を記述する。
+ インスタンス変数を公開したい時は、シンボルを使って、attr_accessor、attr_reader、attr_writer を指定する
+ メソッドを非公開にしたいときは、シンボルを使って、private、protected を指定する
+ クラスメソッド(staticなメソッド)を書くときはself.をメソッド名の前に付ける
++ このselfは、じつはクラスオブジェクト自身を指している

*** 慣習

+ クエリー系メソッドは、メソッド名の最後を&quot;?&quot;で終える。
+ とくにValueObjectで、インスタンスの内容を変更するメソッドは、メソッド名の最後を&quot;!&quot;で終える。

*** クラス・オブジェクトのインスタンス(メソッド/アトリビュート)へのアクセス

基本は&quot;.&quot;を使う

 dog = CurDog.new(&quot;ポチ&quot;)
 dog.bark(&quot;わおーん&quot;)
 dog.wait

定数にアクセスする場合は&quot;::&quot;を使う

 p CurDog::PEDIGREE

ちなみに
メソッド呼び出し時の&quot;()&quot;は省略もできる

 dog = CurDog.new &quot;ポチ&quot;
 dog.bark &quot;わおーん&quot;

ただし
引数括りの()は演算式括りの()よりも優先度が高い

 math.calc (a-b)+c

なんてやるとハマるから、要注意

** 制御構文
*** コメント

 # コメント

*** 使える演算子

 |  ^  &amp;  &lt;=&gt;  ==  ===  =~  &gt;   &gt;=  &lt;   &lt;=   &lt;&lt;  &gt;&gt;
 +  -  *  /    %   **   ~   +@  -@  []  []=  `
 =+ =- =* =/ =% =**
 =  ?:  ..  ...  !  not  &amp;&amp;  and  ||  or  ::

: &lt;=&gt; | 大小比較
: === | [左辺]に[右辺]が含まれるか
: =~ | 正規表現で比較
: += -= *= etc | [左辺]に[右辺]を計算した結果を[左辺]に代入する（自己代入）

ちなみに、++や--は無い。

*** 条件分岐
**** 許容条件

 if 条件式 then
   実行文
 elsif 条件式 then
   実行文
 else
   実行文
 end

 実行文 if 条件式

**** 否定条件

 unless 条件式 then
   実行文
 else
   実行文
 end

 実行文 unless 条件式

**** ケース条件

 case 評価式
 when 式 then
   実行文
 else
   実行文
 end

*** 繰り返し

**** while

 while 条件式 do
   実行文
 end

 実行文 while 条件式

**** until

 until 条件式 do
   実行文
 end

 実行文 until 条件式

**** for

 for 変数 in 範囲式 do
   実行文
 end

じつはfor文はほとんど使わない
 10.times do |i|
 end
した方が楽だしね

**** 途中で制御を抜ける等

break、next、redo、retryが使える

*** 例外構文

**** 例外を発生させる

 raise 例外タイプ

 raise 例外タイプ, メッセージ

 raise メッセージ

**** 例外ブロック

 begin
   実行文
 rescue 例外タイプ =&gt; 変数 then
   レスキュー文
 else
   一般的なレスキュー文
 ensure
   クローズ文
 end

** ほかのファイルを組み込む

組み込みたい位置で
 require &#039;ファイル名&#039;
 require &#039;ディレクトリ/ファイル名&#039;

拡張子&quot;.rb&quot;は不要。

基本的には、カレントディレクトリからの相対パスで指定する。
ただし、gemsでインストールしたライブラリの場合、たいていはライブラリ名だけで大丈夫。
そのかわり、次のrequireを必ず入れること。

 require &#039;rubygems&#039;

** シンタックス・シュガー

Rubyは記述を簡便にするため、インスタンス生成に関するシンタックス・シュガーを用意している。

*** Arrayのインスタンス生成

 array = [val1, val2]

*** Hashのインスタンス生成

 hash = {key1=&gt;val1, key2=&gt;val2}

*** Stringのインスタンス生成

 string = &#039;ruby&#039;

*** Regexpのインスタンス生成

 regexp = /ruby/

*** Fixnumのインスタンス生成

 num = 1

*** Floatのインスタンス生成

 float = 0.1

* ここまでできたら
Javaでフツーにできる事はできるようになる！

----    </description>
    <dc:date>2010-01-31T01:23:54+09:00</dc:date>
  </item>
    <item rdf:about="http://www39.atwiki.jp/startruby/pages/27.html">
    <title>課題！</title>
    <link>http://www39.atwiki.jp/startruby/pages/27.html</link>
    <description>
      * 課題

** パターンA：ある日、プロマネが君の肩を*ポンポン*と叩いて、君にこう言った。

Excelファイル(DATA.xls)からデータを取り出し、こいつ（といって見せたのは、table.rbという名前のインタフェースオブジェクトのソース）を構築してくれ。

DATA.xlsってファイル名は固定で構わないから。

中にいくつシートが入っているかは不明。

シートの中にいくつの項目があるかも不明。

ある分だけ取り出すようにしてほしい。

そうそう、シート名がテーブル名になっているから。

シートの形式は、こんな感じ。

|COL_NAME1|COL_NAME2|COL_NAME3|
|string1|number|date|
|hoge|0|2010/1/30|
|fuga|1|2010/1/31|
...

** パターンB：ある日、プロマネが君の肩をいきなり揉みだし、君にこう言った。

table.rbのインタフェースオブジェクトからデータを読み込んで、テーブルデータを全削除する、DELETE文を吐き出すブロック付きメソッドを作ってくれ。

DELETEするときは、後ろのテーブルから順にな。

インタフェースオブジェクトからデータを読み込んで、INSERT文を吐き出す、ブロック付きメソッドを作ってくれ。

日付型はちゃんと変換してくれ、関数はstr_to_dateな。

文字列型はちゃんとダブルクォーテーションで囲ってくれな。

IDってなってるのがIdentifierだから、そこがnilだったら出力するなよ。DBがコケるから。

INSERTするときは、前のテーブルから順にな。    </description>
    <dc:date>2010-01-28T01:01:43+09:00</dc:date>
  </item>
    <item rdf:about="http://www39.atwiki.jp/startruby/pages/23.html">
    <title>RSpecの構文</title>
    <link>http://www39.atwiki.jp/startruby/pages/23.html</link>
    <description>
      * RSpecの構文

見本は、これ
http://github.com/mitim/tddbc-lrucache/blob/master/lru_cache_spec.rb

** 慣習

RSpec用のテストとして書くテストコードは、[テスト対象のファイル]_spec.rb という名前でつくる。

** なにはなくともrequire

 require &#039;lru_cache&#039;

テスト対象のファイルを読み込ませる。
ちなみに、RSpecの何かをrequireする必要なない。

** まずは基本

 describe do
 end

で、一番外側のブロックを記述する。
通常は、次のようにテスト対象のクラスを宣言しておく。

 describe LRUCache do
 end

また、一緒に説明を付けることも可能。

 describe LRUCache, &quot;を初期化する場合&quot; do
 end

もちろん、説明だけにすることも可能。

 describe &quot;LRUCacheのケース&quot; do
 end 

** describeの中

*** describeの中にもdescribeを重ねられる

たとえば、同じクラスのテストでも、初期化のテストをがっつりやって、次にhogeメソッドのテスト、そしてfugaメソッドのテストを…とやっていくと、必然的にテストが長く見づらくなってくる。
たとえば、hogeメソッドのテストとfugaメソッドのテストとでは、前準備で必要なものがぜんぜん違う。
そんなときには、describeのなかにさらにdescribeを書いて、整理をつけることができる。

*** describeの説明文

ここに何を書くべきか。
自然に仕様書っぽく構成した文書にしたいなら、次のように気をつけて記述してみるといい。

 [クラス名], [て/に/を/は/の]○○する場合(ケース)
 ※クラス名は、ひとつ上のdescribeでまとめてしまった方が記述がスッキリするのは、言うまでも無い。

*** テストの前準備 before

テスト本文（it）を実行する前に必要な、テストと直接は関係ない準備のための処理を記述する。
たとえば、テスト対象のオブジェクトを生成して、インスタンス変数に入れたり。
たとえば、モックやスタブを用意して、本物のオブジェクトと摩り替えたり。
たとえば、ファイルを用意したり。

 before :each do
 end

 before :all do
 end

eachを指定したbeforeは、各テスト(it)のたびに、その前に必ず実行される。
allを指定したbeforeは、describeの最初に一度だけ実行される。

*** テストの後処理 after

テスト（it）を実行した後に必要な、テストと直接は関係ない後片付けのための処理を記述する。
 after :each do
 end

 after :all do
 end

eachを指定したafterは、各テスト(it)を実行するたびに、その後に必ず実行される。
allを指定したafterは、describeの最後に一度だけ実行される。

** itの中

テストのコードは、すべてitの中に記述する。
基本的な書き方は、次のとおり。

 it &quot;テストの説明&quot; do
   [テスト対象オブジェクト].[テスト対象メソッド].should == [結果]
 end

*** itの説明文

ここに何を書くべきか。
自然に仕様書っぽく構成した文書にしたい場合、次のように気をつけて記述してみるといい。

 [どのような操作をする]と、[その結果はどうなる]。

**** 基本的な機能要件を説明する場合

 は、○○すると、××になる。

**** 特殊な機能要件や、エラー的な機能要件を説明する場合

 もし、○○すると、××になる。

*** shouldメソッド

shouldメソッドは、そのオブジェクトの状態を確認し、指定された状態であるか否か(～であるべき)を検査する。
== 演算子のほか、be系のMatcherが多数用意されている。

全てのオブジェクトに動的に加えられたメソッドなので、基本的には何でも検査可能。

*** should_notメソッド

shouldと違い、こちらは否定検査(～であってはいけない)をするときに使用する。

*** Matcher群

shouldで検査できるよう、多数のMatcherが用意されている。

: == expected|==比較の結果が同じか
:be_true|真であるか
:be_false|偽であるか
:be_nil|nilか
:be_empty|Arrayが空か
:be_an_instance_of Class|クラスがClassと一致するか
:be_a_kind_of Class|クラスが指定Class、もしくはそのサブクラスか
:have_key key|keyがあるか
:be_close E,D|数値が、E～Dの範囲に収まっているか
:change receiver,message,&amp;block|Procオブジェクトが変化するか
:change(receiver,message,&amp;block).by value|Procオブジェクトが指定された値で変化するか(should_notは使用できない)
:change(receiver,message,&amp;block).from(before).to(after)|Procオブジェクトがbeforeからafterに変化するか(should_notは使用できない)
:eql expected|==とほぼ同義((eql?で比較)
:equal expected|同じオブジェクトか
:have(n).items|配列などのコレクションオブジェクトが、n個の要素を持っているか。
:have_exactly(n).items|配列などのコレクションオブジェクトが、ちょうどn個の要素を持っているか。(should_notは使用できない)
:have_at_least(n).items|配列などのコレクションオブジェクトが、n個以上の要素を持っているか。(should_notは使用できない)
:have_at_most(n).items|配列などのコレクションオブジェクトが、n個以下の要素を持っているか。(should_notは使用できない)
:include expected|配列などのコレクションオブジェクトに、expectedが入っているか。
:match regexp|正規表現regexpにマッチするか。
:raise_error|例外が発生するか。
:raise_error Expected|Expectedな例外が発生するか。
:raise_error Expected,message|Expectedな例外が、messageを伴って発生するか。
:raise_error Expected,regexp|Expectedな例外が、正規表現にマッチするメッセージを伴って発生するか。
:respond_to method,method,method...|オブジェクトが、指定メソッドを全て持つか。
:satisfy {｜e｜ ...}|ブロックの実行結果（eにテストオブジェクトが渡される）が真になるか。
:thorw_symbol(symbol=nil)|symbolがthrowされるか。

書いてる本人が、使ったことがないMatcherが多数。

*** 例外が発行されたかどうかはどうチェックする？

次のようにすると、例外の捕捉ができ、例外発行チェックができる。

 proc{ [ターゲットオブジェクト].[ターゲットメソッド] }.should raise_error


** スタブ/モック機能

RSpecには、簡単なスタブとモックを組み込む機構が用意されている。
ここでは、RSpecのスタブ/モック機能に焦点を当てる。

簡単な機構なので、もっとダイナミックな仕組みが欲しい場合は、mochaやflex_mockなどのモック専用ライブラリ/フレームワークを利用した方が効率がいい。

*** スタブとモックの違い

スタブもモックも、UnitTestで必要になる、内部使用している部品をエミュレートすることで、本物の部品の代用となる空箱のようなもののことを指す。

なぜこんなものが必要なのか？それは、こんな理由によっている。
-全てを「本物」でテストしようとすると、「全てが揃わないとテストできない」という本末転倒な事が起こりかねない。
-たとえば時刻に関するオブジェクトのように、システムの構成によって変化してしまうオブジェクトがあると、テスト環境によって差異ができてしまう。
-UnitTestが大きな問題に移ると段々と結合テスト化してしまう、という問題がある。
ある程度のスタブ/モックを使用することで、これらの問題が有機的にクリアされていく。
※ ただし、スタブ/モックを多用し過ぎると、今度はインタフェース不一致の発見を先送りにする、という状況にもなりかねない。このあたりはさじ加減が必要。

では、スタブとモックの違いはなにか？
最近、Martin Fowlerらが、このスタブとモックの違いに関して面白い考察をしていた。この定義は今や一般化しており、RSpecでもこの意味でスタブとモックとを使い分けている。

:スタブ|「インタフェースの定義だけ一致していれば、中身はどのように動いてもいいので、とりあえず用意しておく空箱」のことを言う。

:モック|「インタフェースの定義だけではなく、それがどの様に呼ばれるか、またそれに対して何を返すべきかまでを模倣した空箱」のことを言う。

*** スタブ

何かのクラスのアクセッサをスタブ化するときは、次の構文でアクセッサをスタブに摩り替える。

 [クラス].stub!(:[アクセッサ]).and_return([戻り値])
 # [クラス]は[アクセッサ]をスタブ化し、[戻り値]を返す。

たとえば次のように書くと、Stringクラスのsizeメソッドが、必ず10を返却するようになる。

 String.stub!(:size).and_return(10)

*** モック

何かのクラスのアクセッサをモック化するときは、次の構文でアクセッサをモックに摩り替える。

 [クラス].should_recieve(:[アクセッサ])
 # [クラス]は[アクセッサ]が呼ばれることを期待する。
 
 [クラス].should_recieve(:[アクセッサ]).and_return([戻り値])
 # [クラス]は[アクセッサ]が呼ばれることを期待し、その結果として[戻り値]を返す。
 
 [クラス].should_recieve(:[アクセッサ]).with([引数]).and_return([戻り値])
 # [クラス]は[アクセッサ]が[引数]で呼ばれることを期待し、その結果として[戻り値]を返す。

たとえば次のように書くと、Arrayクラスのsliceメソッドが引数(5,5)で呼ばれることを期待し、その結果として[5,6,7,8,9]を返却するようになる。

 Array.should_recieve(:slice).with(5,5).and_return([5,6,7,8,9])

----    </description>
    <dc:date>2010-01-26T23:56:06+09:00</dc:date>
  </item>
    <item rdf:about="http://www39.atwiki.jp/startruby/pages/17.html">
    <title>Rubyらしさ</title>
    <link>http://www39.atwiki.jp/startruby/pages/17.html</link>
    <description>
      * Rubyらしさ

** 文字列で遊ぼう！

*** シンプルな文字列は&#039;&#039;を使う

 string = &#039;これは文字列です。&#039;

ん～～、普通！

*** ちょっとフォーマットしたい時には&quot;&quot;を使う

+ バックスラッシュ記法でコントロール文字を埋め込みたい
+ 変数の値を文字列にフォーマッティングしたい

こんな用途に。

 age = 18
 string = &quot;これは\n文字列です。\nボク永遠の#{age}歳！！&quot;

&quot;#{}&quot;の中は、かならず「式」として評価されるので、変数名がそのまま表記できる。
ちなみに、単なる計算式でもOK

**** 主なバックスラッシュ記法

||\t||タブ||
||\n||改行||
||\r||キャリッジリターン||
||\f||改ページ||
||\b||バックスペース||
||\a||ベル||
||\e||エスケープ||
||\s||空白||
||\nnn||8 進数表記||
||\xnn||16 進数表記||
||\cx||コントロール文字 (x は ASCII 文字)||
||\C-x||コントロール文字 (x は ASCII 文字)||
||\x||文字 x そのもの||

*** 長文！ヒアドキュメント

たとえば、HTMLのテンプレートな部分とか…
たとえば、メールの長い典型文とか…
そんな時はヒアドキュメント

 STRING = &lt;&lt;&quot;EOS&quot;
 これは
 文字列です。
 ボク永遠の#{age}歳！！
 EOS

ちなみに、&lt;&lt;&#039;EOS&#039; ~ EOS と書けば、&#039;&#039;囲みの文字列と同等の扱いになり、&lt;&lt;&quot;EOS&quot; ~ EOS と書けば、&quot;&quot;囲みの文字列と同等の扱いになる。

** ここから先の前提知識：ブロック

:ブロックとは?|スコープの最小単位

 do
   実行文
 end
または
 {
   実行文
 }
{～}の方がdo～endより少しだけ優先度が高い

** ブロック付きメソッド（いわゆるクロージャ）

*** 使い方

 def hoge(ary)
   ret = &quot;result:&quot;
   ary.each do |i|
     ret += i
   end
   return ret
 end
または
 def hoge(ary)
   ret = &quot;result:&quot;
   ary.each { |i|
     ret += i
   }
   return ret
 end

+hogeメソッドからaryのeachを呼び出す
+eachメソッド内から、ブロックが呼ばれる
++|i|にeachからの引数(配列の内容)が渡る
++retに、渡された引数がどんどん連結される
+aryの内容をすべて連結した文字列を返す

**** イテレータ

10回ﾙｰﾌﾟを普通にやると
 for i in [0..9] do
   p i
 end

ブロック付きメソッドを使うと
 [0..9].each do |i|
   p i
 end

…あんまり変わらないかな？
でも、じつはこんなやり方も
 10.times do |i|
   p i
 end

for文より自然っぽくない？

**** open/close制御

ファイルを開いて閉じるを普通にやると
 file = nil
 begin
   file = File.open(&quot;hoge.txt&quot;)
   実行文
 ensure
   file.close unless file == nil
 end

ブロック付きメソッドを使うと
 File.open(&quot;hoge.txt&quot;) do |file|
   実行文
 end

何が便利かって、JavaやC#で起きがちな「クローズするためだけに延々とtry－finally記述が感染していく」がないこと！
例外ブロックも最適化できる！

*** ブロック付きメソッドの作り方

 def hoge
   実行文
   yield
   実行文
 end

引数があるときは
 def hoge
   実行文
   yield(item)
   実行文
 end
** 動性の高いRubyのリフレクション

リフレクションという認識すらないくらい、「普通のこと」になっている。
これもまた、動的言語で「すべてがオブジェクト」の世界観が成せる技。
次のような動的拡張が可能になっている。

*** 既存のクラスにメソッドを拡張する

既存のArrayクラスにhogeというメソッドを追加する場合、次のように書けば良い。

 class Array
   def hoge
   end
 end

これ、なんと組み込みクラスにも可能。

もちろん、既存のメソッドを書き換えることも可能！

*** 既存のオブジェクトにメソッドを拡張する

クラスにメソッドを拡張すると、なにかとメンドクサイ問題が出る場合がある。
そんな時は、対象となるオブジェクトにだけメソッドを拡張する。

 array = []
 
 def array.hoge
 end

*** いちいち一個ずつメソッドを書き換えたり、メンドクサくない？って時にはMixIn

モジュールとは「機能的に同じものをまとめて定義しておく」機能のこと。
クラスとは違い、継承ができないし、インスタンスの生成もできない。
「GUIでのコントローラをモジュールで表現」のような使い方をする。
「そのクラスの直接的な機能じゃないけれど、副次的に必要になるユーティリティ的機能」などをモジュール化しておくと、なにかと便利。

 module KeyNameListItem
   def value
     @name = &#039;&#039; unless defined? @name
     @key = @name unless defined? @key
     if (@key == @name)
       return @name
     end
     return &quot;#{@key} - #{@name}&quot; 
   end
   
   attr_reader :key
 end

というモジュールをつくっておいて、GUIで「このクラスをリスト表示したい！」というときにさらっと 

 class Section
   include KeyNameListItem
 end

というように、クラス再定義で組み込んでしまえる。

*** もちろん、オブジェクトにもMixIn

  section = Section.new
  
  section.extend KeyNameListItem

これらの再定義をうまく使っていくと、JavaやC#にありがちなXxxUtilとか、XxxHelperとかいったクラスが必要ないという事に気づくはず！

----

さあ！いま、Rubyという自由の羽を得た！！
飛び立とう！！
めくるめくオブジェクトの世界へ！！

----    </description>
    <dc:date>2010-01-25T21:50:50+09:00</dc:date>
  </item>
    <item rdf:about="http://www39.atwiki.jp/startruby/pages/25.html">
    <title>たくさんあるよ！ライブラリ</title>
    <link>http://www39.atwiki.jp/startruby/pages/25.html</link>
    <description>
      * たくさんあるよ！ライブラリ

とても紹介しきれないので、いくつか絞って。

** XMLライブラリ (標準添付)

[[REXML&gt;http://www.germane-software.com/software/XML/rexml/docs/tutorial.html]]

** HTMLパーサ

[[Nokogiri&gt;http://route477.net/rubyscraping/?Nokogiri]]

** Oracleインタフェース

[[ruby-oci8&gt;http://ruby-oci8.rubyforge.org/ja/index.html]]

** Excel操作ライブラリ

[[spreadsheet&gt;http://rubyforge.org/projects/spreadsheet/]]

** Ruby製 Make

[[rake&gt;http://rake.rubyforge.org/]]

** ご存知、総合Webフレームワーク

[[Ruby on Rails&gt;http://rubyonrails.org/]]

そのほとんどは宝石箱(gems)の中に……    </description>
    <dc:date>2010-01-25T21:48:01+09:00</dc:date>
  </item>
    <item rdf:about="http://www39.atwiki.jp/startruby/pages/26.html">
    <title>Rubyでもドキュメンテーション</title>
    <link>http://www39.atwiki.jp/startruby/pages/26.html</link>
    <description>
      * Rubyでもドキュメンテーション

** RDocを使ってみよう！

RDocの&quot;書きどころ&quot;は、JavaDocなどと同じ。
クラスの前、メソッドの前、シンボルの前、ファイルのトップなど。

 # ドキュメンテーション

と、コメントのように書くだけでOK。

** 修飾してみよう！

作成者やライセンス情報などの書き方

 #Authors::   MitiM
 #Version::   1.0
 #Copyright:: Copyright (C) MitiM, 2010. All rights reserved.
 #License::   Ruby License

基本的に::で区切れば、好きな項目を作成可能。

見出し&lt;H1&gt;～&lt;H3&gt;は

 #= 見出しレベル1
 #== 見出しレベル2
 #=== 見出しレベル3

箇条書きは、-(*)で・。+でナンバリング。

 #- レベル1
 #  - レベル2
 #+ レベル1
 #  + レベル2

RDoc内でコメントにしたいなら

 #--
 # この中はドキュメンテーションされない
 #++

** RDocとして書き出すのは

 $ rdoc [ソースファイル.rb]    </description>
    <dc:date>2010-01-25T21:22:35+09:00</dc:date>
  </item>
    <item rdf:about="http://www39.atwiki.jp/startruby/pages/22.html">
    <title>これだけは覚えておきたい！コマンド</title>
    <link>http://www39.atwiki.jp/startruby/pages/22.html</link>
    <description>
      * これだけは覚えておきたい！コマンド

** コンソールでいろいろ試す

 $ irb

コンソール上でインタラクティブに実行できるRuby。
ソースの保存以外は何でも「Rubyのソースのように」記述し、その場で実行できる。

こんな構文、できるの？この動きは何？
迷ったときは、まずirb！

** ドキュメントを見る

 $ ri [クラス名]#[メソッド名]

.区切りでもOK。
英語だけれど、知りたいクラスやメソッドがその場でわかる。

** ライブラリをダウンロードする

 $ gem install [ライブラリ名]

空白区切りで、複数ライブラリを一気にダウンロードすることも可能。
ちなみに、依存ライブラリがあった場合は、勝手にダウンロードされる。

 $ gem list

で、インストールされているライブラリの一覧も表示可能。

** RSpecでテストをする

 $ spec -c -fs [テストコード名]

いちいちテストの説明を見なくてもいいときは、-fsを外す。

Windowsはwin32console(gemでインストール)が入っていないとカラー表示できないので、注意！

----    </description>
    <dc:date>2010-01-25T20:53:47+09:00</dc:date>
  </item>
  </rdf:RDF>

