Start! Ruby

Start! Ruby
偉そうにしてる人の自己紹介
名前 : 榎原 明生
P.N. : MitiM(未知夢)
仕事 : 開発者やってます
主に業務系です
最近はホント何でも屋、MP以外はたいてい齧ってます
隠れAgilerです
Ruby暦 : 出会いは1998年ごろ
当時はUnixで動かすのが当たり前という言語で、
Windows上に環境を構築するのが難しかった
プログラム:言語マニアの毛があります
けっこう重度のTDDerかつ迷えるTDDerです
なんでお前が喋るの?:なりゆきです!
Start! Ruby
・ なぜRuby?
・ Smalltalkの思想を模倣した設計思想
・ 基本的な構文
・ Rubyらしさ
Start! Ruby
短期化する開発
3ヶ月単位の開発が増えてきた!
開発者は黙って徹夜休出を耐えるしかないのか?
* 開発現場を効率良く回す
* OSSフレームワークを効果的に採用する
* 自動化できる部分はできうる限り自動化する
なぜRuby?
自動化できる部分はできうる限り自動化する
* Ci等大きなツールはOSSを利用
* Dbにリソースを放り込むとか細かい糊的ツールが必要
->
つくらにゃ!
なぜRuby?
自動化するためにはツールをつくらにゃ!
* ツールのキモは「素早く実装」「使いながらメンテ」
* 開発対象の言語で作る!
-> c#にしてもJavaにしても重厚感はいなめない
* Excelのマクロ!
-> nullとNothingの嵐に眩暈が
* WindowsScriptingHostを使う!
-> OfficeはOLEで使えるけど、ライブラリ不足が否めない…
*
LLは??
なぜRuby?
開発用ツールをLLで書くことの有用性
Perl、Python、Rubyとあるけれど…
* 糊として手軽である
* 開発効率がとってもいい
* 大抵のライブラリが揃っている
-> ライブラリマネージャ(cpan、egg、gem)で
ネットから楽々インストール
で、なんでRubyなの?
なぜRuby?
趣味です!!
なぜRuby?
ほとんど全てがオブジェクト
* メソッドもオブジェクト
* クラス定義もオブジェクト
* 詳しく:クラス構造の定義とグローバルオブジェクト化宣言を
同時に書いている
* nil(Javaのnull)すらもオブジェクト
* NullObjectパタンが簡単に!
Smalltalkの思想を模倣した設計思想
全てがオブジェクトだとどうなの?
* 全てが何かのクラスに所属している
* 全てに操作のためのメソッドが存在する
オブジェクトじゃないもの
* 式(メソッド扱いを除く)
* 制御構文
-> 「式」として扱われる
* 定義構文
* シンタックス・シュガー
Smalltalkの思想を模倣した設計思想
式?
* 値を返すもの
・ メソッド
・ 演算
・ 制御構文
Smalltalkの思想を模倣した設計思想
ほとんど全てがメソッド
* 演算子もメソッド
・ 再定義が可能
・ ValueObjectの"=="は同値性を保証するのに大活躍
メソッドじゃない演算子
= ?: .. ... ! not && and || or ::
Smalltalkの思想を模倣した設計思想
メッセージ・ドリブン
DuckTyping - 「もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである」
* メッセージ・パッシングした先のオブジェクトが
・ 「何のクラスか」が大事なのではない
・ 「そのメソッドを持っている/持っていない」が大事
* 持ってなかったらどうなる?
・ NoMethodError が飛ぶ
Smalltalkの思想を模倣した設計思想
命名規則
定数
大文字で始まる
変数
小文字で始まる
慣習
1. クラス名はパスカル記法
class HogeHoge
2. メソッド名、変数名は_区切
りの小文字
def hoge_hoge
hoge_hoge = 0
3. 定数名は_区切りの大文字
HOGE_HOGE = "hoge"
基本的な構文
変数とシンボル
変数のスコープ
rubyのスコープの思想「最小単位はブロック(not メソッド、not 式)」
rubyの変数の思想「変数のスコープはなるべく局所化しろ」
スコープ=ブロック・ローカル
hoge
スコープ=インスタンス
@hoge
シンボル
:hoge
同名の変数に対してリンクを張っている。
スコープ=クラス
@@hoge
スコープ=グローバル
$hoge
基本的な構文
メソッドの定義
引数なし
def bark
end
引数あり
def bark(time)
end
複数の引数あり、初期化付き
def bark(time, voice="ばう")
end
可変長引数
def bark(*voice)
end
メソッドのスコープは基本的にパブリック
基本的な構文
クラスの定義
class CurDog < Dog
PEDIGREE = "雑種"
attr_reader :name
def initialize(name)
@name = name
end
def bark(voice="ばう")
p voice
end
rubyの面白いところ:クラスとは「クラスオブジェク
トの定数」にしか過ぎない。
クラスオブジェクト??
クラス定義に従ってインスタンスを生成できる イ
ンスタンス工場 のこと。
def wait
shit
end
def self.cute
p "きゅぅーん"
end
private :shit
def shit
p "ポトリ"
end
end
基本的な構文
クラスの定義
ポイント
1. newは特別なメッセージ。メソッドとして独自定義できない。
2. initializeはnewした時に自動で呼ばれるメソッド。引数を加えることができる。
3. 継承したい時は < [継承元] と記述する。
4. インスタンス変数を公開したい時は、
シンボルを使って、attr_accessor、attr_reader、attr_writer を指定する
5. メソッドを非公開にしたいときは、シンボルを使って、private、protected を
指定する
6. クラスメソッド(staticなメソッド)を書くときはself.をメソッド名の前に付ける
※ このselfは、じつはクラスオブジェクト自身を指している
慣習
1. クエリー系メソッドは、メソッド名の最後を"?"で終える。
2. とくにValueObjectで、インスタンスの内容を変更するメソッドは、
メソッド名の最後を"!"で終える。
基本的な構文
クラス・オブジェクトのインスタンス(メソッド/アトリビ
ュート)へのアクセス
基本は"."を使う
dog = CurDog.new("ポチ")
dog.bark("わおーん")
dog.wait
定数にアクセスする場合は"::"を使う
p CurDog::PEDIGREE
ちなみに
メソッド呼び出し時の"()"は省略もできる
dog = CurDog.new "ポチ"
dog.bark "わおーん"
ただし
引数括りの()は演算式括りの()よりも優先度が高い
math.calc (a-b)+c
なんてやるとハマるから、要注意
基本的な構文
制御構文
コメント
# コメント
使える演算子
| ^ & <=> == === =~ > >= < <= << >>
+ - * / % ** ~ +@ -@ [] []= `
=+ =- =* =/ =% =**
= ?: .. ... ! not && and || or ::
<=>
大小比較
===
[左辺]に[右辺]が含まれるか
=~
正規表現で比較
+= -= etc
[左辺]に[右辺]を計算した結果を[左辺]に代入する
(自己代入)
ちなみに、++や--は無い。
基本的な構文
制御構文
条件分岐
許容条件
否定条件
if 条件式 then
実行文
elsif 条件式 then
実行文
else
実行文
end
unless 条件式 then
実行文
else
実行文
end
実行文 if 条件式
実行文 unless 条件式
ケース条件
case 評価式
when 式 then
実行文
else
実行文
end
基本的な構文
制御構文
繰り返し
while
until
while 条件式 do
実行文
end
until 条件式 do
実行文
end
実行文 while 条件式
実行文 until 条件式
for
for 変数 in 範囲式 do
実行文
end
じつはfor文はほとんど使わない
10.times do |i|
end
途中で制御を抜ける等
した方が楽だしね
break、next、redo、retryが使える
基本的な構文
制御構文
例外構文
例外を発生させる
raise 例外タイプ
raise 例外タイプ, メッセージ
raise メッセージ
例外ブロック
begin
実行文
rescue 例外タイプ => 変数 then
レスキュー文
else
一般的なレスキュー文
ensure
クローズ文
end
基本的な構文
制御構文
ほかのファイルを組み込む
組み込みたい位置で
require 'ファイル名'
require 'ディレクトリ/ファイル名'
拡張子".rb"は不要。
基本的には、カレントディレクトリからの相対パスで指定する。
ただし、gemsでインストールしたライブラリの場合、たいていはライブラリ名だけで大丈夫
。
そのかわり、次のrequireを必ず入れること。
require 'rubygems'
基本的な構文
制御構文
シンタックス・シュガー
Rubyは記述を簡便にするため、インスタンス生成に関するシンタックス・シュガーを用意して
いる
Arrayのインスタンス生成
Regexpのインスタンス生成
array = [val1, val2]
regexp = /ruby/
Hashのインスタンス生成
Fixnumのインスタンス生成
hash = {key1=>val1, key2=>val2}
num = 1
Stringのインスタンス生成
Floatのインスタンス生成
string = 'ruby'
float = 0.1
基本的な構文
ここまでできたら
Javaでフツーにできる事は
できるようになる!
基本的な構文
文字列で遊ぼう!
シンプルな文字列は''を使う
string = 'これは文字列です。'
ん~~、普通!
ちょっとフォーマットしたい時には""を使う
1. バックスラッシュ記法でコントロール文字を埋め込みたい
2. 変数の値を文字列にフォーマッティングしたい
こんな用途に。
age = 18
string = "これは\n文字列です。\nボク永遠の#{age}歳!!"
"#{}"の中は、かならず「式」として評価されるので、変数名がそのまま表記できる。
ちなみに、単なる計算式でもOK
Rubyらしさ
文字列で遊ぼう!
長文!ヒアドキュメント
たとえば、HTMLのテンプレートな部分とか
…
たとえば、メールの長い典型文とか…
そんな時はヒアドキュメント
STRING = <<"EOS"
これは
文字列です。
ボク永遠の#{age}歳!!
EOS
ちなみに、<<'EOS' ~ EOS と書けば、''囲みの
文字列と同等の扱いになり、<<"EOS" ~ EOS
と書けば、""囲みの文字列と同等の扱いにな
る。
\t
タブ
\n
改行
\r
キャリッジリターン
\f
改ページ
\b
バックスペース
\a
ベル
\e
エスケープ
\s
空白
\nnn
8 進数表記
\xnn
16 進数表記
\cx
\C-x
コントロール文字 (x は ASCII 文字
)
\x
文字 x そのもの
主なバックスラッシュ記法
Rubyらしさ
ここから先の前提知識:ブロック
ブロックとは?
スコープの最小単位
do
実行文
end
または
{
実行文
}
{~}の方がdo~endより少しだけ優先度が高い
Rubyらしさ
ブロック付きメソッド(いわゆるクロージャ)
使い方
def hoge(ary)
ret = "result:"
ary.each do |i|
ret += i
end
return ret
end
または
1. hogeメソッドからaryのeachを呼び出す
2. eachメソッド内から、ブロックが呼ばれる
2-1. |i|にeachからの引数(Arrayの内容)が渡る
2-2. retに、渡された引数がどんどん連結される
3. aryの内容をすべて連結した文字列を返す
def hoge(ary)
ret = "result:"
ary.each { |i|
ret += i
}
return ret
end
Rubyらしさ
ブロック付きメソッド(いわゆるクロージャ)
イテレータ
10回ループを普通にやると
for i in [0..9] do
pi
end
ブロック付メソッドを使うと
[0..9].each do |i|
pi
end
…あんまり変わらないかな?
でも、じつはこんなやり方も
10.times do |i|
pi
end
for文より自然っぽくない?
open/close制御
ファイルを開いて閉じるを普通にやると
file = nil
begin
file = File.open("hoge.txt")
実行文
ensure
file.close unless file == nil
end
ブロック付きメソッドを使うと
File.open("hoge.txt") do |file|
実行文
end
何が便利かって、JavaやC#で起きがちな「クロー
ズするためだけに延々とtry-finally記述が感染し
ていく」がないこと!
例外ブロックも最適化できる!
Rubyらしさ
ブロック付きメソッド(いわゆるクロージャ)
ブロック付きメソッドの作り方
def hoge
実行文
yield
実行文
end
引数があるときは
def hoge
実行文
yield(item)
実行文
end
Rubyらしさ
動性の高いRubyのリフレクション
リフレクションという認識すらないくらい、「普通のこと」になっている。
これもまた、動的言語で「すべてがオブジェクト」の世界観が成せる技。
次のような動的拡張が可能になっている。
既存のクラスにメソッドを拡張する
既存のArrayクラスにhogeというメソッドを追加する場合、次のように書けば良い。
class Array
def hoge
end
end
これ、なんと組み込みクラスにも可能。
もちろん、既存のメソッドを書き換えることも可能
!
Rubyらしさ
動性の高いRubyのリフレクション
既存のオブジェクトにメソッドを拡張する
クラスにメソッドを拡張すると、なにかとメンドクサイ問題が出る場合がある
。
そんな時は、対象となるオブジェクトにだけメソッドを拡張する。
array = []
def array.hoge
end
Rubyらしさ
動性の高いRubyのリフレクション
いちいち一個ずつメソッドを書き換えたり、
メンドクサくない?って時にはMixIn
モジュールとは「機能的に同じものをまとめて定義しておく」機能のこと。
クラスとは違い、継承ができないし、インスタンスの生成もできない。
「GUIでのコントローラをモジュールで表現」のような使い方をする。
「そのクラスの直接的な機能じゃないけれど、副次的に必要になるユーティリ
ティ的機能」などをモジュール化しておくと、なにかと便利。
Rubyらしさ
動性の高いRubyのリフレクション
たとえば
module KeyNameListItem
def value
@name = '' unless defined? @name
@key = @name unless defined? @key
if (@key == @name)
return @name
end
return "#{@key} - #{@name}"
end
attr_reader :key
end
というモジュールをつくっておいて
Rubyらしさ
動性の高いRubyのリフレクション
GUIで「このクラスをリスト表示したい!」というときにさらっと
class Section
include KeyNameListItem
end
というように、クラス再定義で組み込んでしまえる。
もちろん、オブジェクトにもMixIn
section = Section.new
section.extend KeyNameListItem
Rubyらしさ
動性の高いRubyのリフレクション
これらの再定義をうまく使っていくと…
JavaやC#にありがちな
XxxUtil
とか
XxxHelper
とかいったクラスが必要ないという事に気づくはず!
Rubyらしさ
RDocを使ってみよう!
RDocの"書きどころ"は、JavaDocなどと同じ。
クラスの前、メソッドの前、シンボルの前、ファイルのトップなど
。
# ドキュメンテーション
と、コメントのように書くだけでOK。
修飾してみよう!
作成者やライセンス情報などの書き方
#Authors:: MitiM
#Version:: 1.0
#Copyright:: Copyright (C) MitiM, 2010. All rights
reserved.
#License:: Ruby License
基本的に::で区切れば、好きな項目を作成可能。
Rubyでもドキュメンテーション
RDocを使ってみよう!
修飾してみよう!
見出し<H1>~<H3>は
箇条書きは、-(*)で・。+でナンバリング。
#= 見出しレベル1
#== 見出しレベル2
#=== 見出しレベル3
#- レベル1
# - レベル2
#+ レベル1
# + レベル2
RDoc内でコメントにしたいなら
#-# この中はドキュメンテーションされない
#++
RDocとして書き出すのは
$ rdoc [ソースファイル.rb]
Rubyでもドキュメンテーション
これだけは覚えておきたい!コマンド
コンソールでいろいろ試す
$ irb
コンソール上でインタラクティブに実行できるRuby。
ソースの保存以外は何でも「Rubyのソースのように」記述し、その場で実行できる
。
こんな構文、できるの?この動きは何?
迷ったときは、まずirb!
ドキュメントを見る
$ ri [クラス名]#[メソッド名]
.区切りでもOK。
英語だけれど、知りたいクラスやメソッドがその場でわかる
。
コンソール!
これだけは覚えておきたい!コマンド
ライブラリをダウンロードする
$ gem install [ライブラリ名]
空白区切りで、複数ライブラリを一気にダウンロードすることも可能。
ちなみに、依存ライブラリがあった場合は、勝手にダウンロードされる。
$ gem list
で、インストールされているライブラリの一覧も表示可能。
RSpecでテストをする
$ spec -c -fs [テストコード名]
いちいちテストの説明を見なくてもいいときは、-fsを外す。
Windowsはwin32console(gemでインストール)が入っていないとカラー表示できないので、
注意!
コンソール!
たくさんあるよ!ライブラリ
とても紹介しきれないので、いくつか絞って。
役割
ライブラリ名
URL
XMLライブラリ (標準添付) REXML
http://www.germanesoftware.com/software/XML/rexml/docs/tut
orial.html
HTMLパーサ
Nokogiri
http://route477.net/rubyscraping/?Nokogiri
Oracleインタフェース
ruby-oci8
http://ruby-oci8.rubyforge.org/ja/index.html
Excel操作ライブラリ
spreadsheet
http://rubyforge.org/projects/spreadsheet/
Ruby製 Make
rake
http://rake.rubyforge.org/
ご存知、総合Webフレーム Ruby on Rails
ワーク
http://rubyonrails.org/
そのほとんどは宝石箱(gems)の中に……
ライブラリ!
カッコイイ事言います
さあ!いま、Rubyという自由の羽を得た!!
飛び立とう!!
めくるめくオブジェクトの世界へ!!
最後に…