Start!! Ruby
-
Upload
mitim -
Category
Technology
-
view
1.777 -
download
2
description
Transcript of Start!! Ruby
SStart!tart! RubyRuby
SStart!tart! RubyRuby
偉そうにしてる人の自己紹介 名前:榎原明生
P.N. : MitiM(未知夢)
仕事:開発者やってます 主に業務系です 最近はホント何でも屋、MP以外はたいてい齧ってます 隠れ Agilerです
Ruby 暦:出会いは 1998年ごろ 当時は Unixで動かすのが当たり前という言語で、 Windows上に環境を構築するのが難しかった
プログラム:言語マニアの毛があります けっこう重度の TDDerかつ迷える TDDerです
なんでお前が喋るの?:なりゆきです!
・なぜ Ruby?
・ Smalltalkの思想を模倣した設計思想
・基本的な構文
・ Rubyらしさ
SStart!tart! RubyRuby
なぜ Ruby?
* 開発現場を効率良く回す
* OSSフレームワークを効果的に採用する
* 自動化できる部分はできうる限り自動化する
短期化する開発3ヶ月単位の開発が増えてきた!開発者は黙って徹夜休出を耐えるしかないのか?
なぜ Ruby?
自動化できる部分はできうる限り自動化する
* Ci等大きなツールは OSSを利用
* Dbにリソースを放り込むとか細かい糊的ツールが必要
-> つくらにゃ!
なぜ Ruby?
自動化するためにはツールをつくらにゃ!
* ツールのキモは「素早く実装」「使いながらメンテ」
* 開発対象の言語で作る! -> c#にしても Javaにしても重厚感はいなめない
* Excelのマクロ! -> nullと Nothingの嵐に眩暈が
* WindowsScriptingHostを使う! -> Officeは OLE …で使えるけど、ライブラリ不足が否めない
* LLは??
なぜ Ruby?
開発用ツールを LLで書くことの有用性Perl、 Python、 Ruby … とあるけれど
* 糊として手軽である
* 開発効率がとってもいい
* 大抵のライブラリが揃っている -> ライブラリマネージャ (cpan、 egg、 gem)で ネットから楽々インストール
で、なんで Rubyなの?
趣味です!!
なぜ Ruby?
Smalltalkの思想を模倣した設計思想
ほとんど全てがオブジェクト
* メソッドもオブジェクト
* クラス定義もオブジェクト * 詳しく:クラス構造の定義とグローバルオブジェクト化宣言を 同時に書いている
* nil(Javaの null)すらもオブジェクト * NullObjectパタンが簡単に!
Smalltalkの思想を模倣した設計思想
全てがオブジェクトだとどうなの?
* 全てが何かのクラスに所属している
* 全てに操作のためのメソッドが存在する
オブジェクトじゃないもの * 式 (メソッド扱いを除く )
* 制御構文 -> 「式」として扱われる
* 定義構文
* シンタックス・シュガー
Smalltalkの思想を模倣した設計思想
式? * 値を返すもの ・メソッド
・演算
・制御構文
Smalltalkの思想を模倣した設計思想
ほとんど全てがメソッド * 演算子もメソッド
・再定義が可能
・ ValueObjectの "=="は同値性を保証するのに大活躍
メソッドじゃない演算子= ?: .. ... ! not && and || or ::
Smalltalkの思想を模倣した設計思想
メッセージ・ドリブンDuckTyping - 「もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである」
* メッセージ・パッシングした先のオブジェクトが
・「何のクラスか」が大事なのではない
・「そのメソッドを持っている /持っていない」が大事
* 持ってなかったらどうなる?
・ NoMethodError が飛ぶ
基本的な構文
命名規則定数
大文字で始まる
変数
小文字で始まる
慣習1. クラス名はパスカル記法
2. メソッド名、変数名は _区切りの小文字
3. 定数名は _区切りの大文字
class HogeHoge
def hoge_hogehoge_hoge = 0
HOGE_HOGE = "hoge"
基本的な構文
変数とシンボル変数のスコープrubyのスコープの思想「最小単位はブロック (not メソッド、 not 式 )」
rubyの変数の思想「変数のスコープはなるべく局所化しろ」
スコープ=ブロック・ローカル
スコープ=インスタンス
スコープ=クラス
スコープ=グローバル
hoge
@hoge
@@hoge
$hoge
シンボル
同名の変数に対してリンクを張っている。
:hoge
基本的な構文
メソッドの定義引数なし
引数あり
複数の引数あり、初期化付き
可変長引数
メソッドのスコープは基本的にパブリック
def barkend
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 def wait shit end def self.cute p "きゅぅーん " end private :shit def shit p "ポトリ " endend
rubyの面白いところ:クラスとは「クラスオブジェクトの定数」にしか過ぎない。
クラスオブジェクト??
クラス定義に従ってインスタンスを生成でき るインスタンス工場 のこと。
基本的な構文
クラスの定義ポイント
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
実行文 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 例外タイプ => 変数 then レスキュー文else 一般的なレスキュー文ensure クローズ文end
基本的な構文
制御構文ほかのファイルを組み込む組み込みたい位置
で
拡張子 ".rb"は不要。
基本的には、カレントディレクトリからの相対パスで指定する。ただし、 gemsでインストールしたライブラリの場合、たいていはライブラリ名だけで大丈夫。
そのかわり、次の requireを必ず入れること。
require 'ファイル名 'require 'ディレクトリ /ファイル名 '
require 'rubygems'
制御構文
基本的な構文
シンタックス・シュガーRubyは記述を簡便にするため、インスタンス生成に関するシンタックス・シュガーを用意している
Arrayのインスタンス生成
Hashのインスタンス生成
Stringのインスタンス生成
Regexpのインスタンス生成
Fixnumのインスタンス生成
Floatのインスタンス生成
array = [val1, val2]
hash = {key1=>val1, key2=>val2}
string = 'ruby'
regexp = /ruby/
num = 1
float = 0.1
基本的な構文
ここまでできたら
Javaでフツーにできる事は
できるようになる!
Rubyらしさ
文字列で遊ぼう!シンプルな文字列は ''を使う
string = 'これは文字列です。 '
ん~~、普通!
ちょっとフォーマットしたい時には ""を使う1. バックスラッシュ記法でコントロール文字を埋め込みたい2. 変数の値を文字列にフォーマッティングしたい
こんな用途に。age = 18string = "これは \n文字列です。 \nボク永遠の #{age}歳!! "
"#{}"の中は、かならず「式」として評価されるので、変数名がそのまま表記できる。ちなみに、単なる計算式でも OK
Rubyらしさ
文字列で遊ぼう!
主なバックスラッシュ記法
長文!ヒアドキュメント
たとえば、 HTMLのテンプレートな部分…とか
…たとえば、メールの長い典型文とかそんな時はヒアドキュメント
ちなみに、 <<'EOS' ~ EOS と書けば、 ''囲みの文字列と同等の扱いになり、 <<"EOS" ~ EOS と書けば、 ""囲みの文字列と同等の扱いになる。
STRING = <<"EOS"これは文字列です。ボク永遠の #{age}歳!!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 retend
または
def hoge(ary) ret = "result:" ary.each { |i| ret += i } return retend
1. hogeメソッドから aryの eachを呼び出す
2. eachメソッド内から、ブロックが呼ばれる
2-1. |i|に eachからの引数 (Arrayの内容 )が渡る
2-2. retに、渡された引数がどんどん連結される
3. aryの内容をすべて連結した文字列を返す
ブロック付きメソッド(いわゆるクロージャ)
Rubyらしさ
イテレータ10 回ループを普通にやると
ブロック付メソッドを使うと
…あんまり変わらないかな?でも、じつはこんなやり方も
for 文より自然っぽくない?
for i in [0..9] do p iend
[0..9].each do |i| p iend
10.times do |i| p iend
open/close制御ファイルを開いて閉じるを普通にやると
ブロック付きメソッドを使うと
何が便利かって、 Javaや C#で起きがちな「クローズするためだけに延々と try- finally記述が感染していく」がないこと!例外ブロックも最適化できる!
file = nilbegin file = File.open("hoge.txt") 実行文ensure file.close unless file == nilend
File.open("hoge.txt") do |file| 実行文end
Rubyらしさ
ブロック付きメソッド(いわゆるクロージャ)ブロック付きメソッドの作り方
def hoge 実行文 yield 実行文end
def hoge 実行文 yield(item) 実行文end
引数があるときは
Rubyらしさ
動性の高い Rubyのリフレクションリフレクションという認識すらないくらい、「普通のこと」になっている。これもまた、動的言語で「すべてがオブジェクト」の世界観が成せる技。次のような動的拡張が可能になっている。
既存のクラスにメソッドを拡張する既存の Arrayクラスに hogeというメソッドを追加する場合、次のように書けば良い。class Array def hoge endend
これ、なんと組み込みクラスにも可能。
もちろん、既存のメソッドを書き換えることも可能!
Rubyらしさ
動性の高い Rubyのリフレクション既存のオブジェクトにメソッドを拡張するクラスにメソッドを拡張すると、なにかとメンドクサイ問題が出る場合がある。そんな時は、対象となるオブジェクトにだけメソッドを拡張する。array = []
def array.hogeend
Rubyらしさ
動性の高い Rubyのリフレクションいちいち一個ずつメソッドを書き換えたり、メンドクサくない?って時にはMixInモジュールとは「機能的に同じものをまとめて定義しておく」機能のこと。
クラスとは違い、継承ができないし、インスタンスの生成もできない。
「 GUIでのコントローラをモジュールで表現」のような使い方をする。
「そのクラスの直接的な機能じゃないけれど、副次的に必要になるユーティリティ的機能」などをモジュール化しておくと、なにかと便利。
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 :keyend
動性の高い Rubyのリフレクション
Rubyらしさ
というモジュールをつくっておいて
たとえば
GUIで「このクラスをリスト表示したい!」というときにさらっと
動性の高い Rubyのリフレクション
Rubyらしさ
class Section include KeyNameListItemend
というように、クラス再定義 で組み込んでしまえる。
もちろん、オブジェクトにもMixIn
section = Section.new section.extend KeyNameListItem
…これらの再定義をうまく使っていくと
Javaや C#にありがちな
XxxUtil
とか
XxxHelper
とかいったクラスが必要ないという事に気づくはず!
Rubyらしさ
動性の高い Rubyのリフレクション
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]
コンソール!
これだけは覚えておきたい!コマンドコンソールでいろいろ試す
$ irb
コンソール上でインタラクティブに実行できる Ruby。ソースの保存以外は何でも「 Rubyのソースのように」記述し、その場で実行できる。
こんな構文、できるの?この動きは何?迷ったときは、まず irb!
ドキュメントを見る$ ri [クラス名 ]#[メソッド名 ]
.区切りでも OK。英語だけれど、知りたいクラスやメソッドがその場でわかる。
これだけは覚えておきたい!コマンドライブラリをダウンロードする$ gem install [ライブラリ名 ]
空白区切りで、複数ライブラリを一気にダウンロードすることも可能。ちなみに、依存ライブラリがあった場合は、勝手にダウンロードされる。$ gem list
で、インストールされているライブラリの一覧も表 示可能。
RSpecでテストをする$ spec -c -fs [テストコード名 ]
いちいちテストの説明を見なくてもいいときは、 -fsを外す。
Windowsは win32console(gemでインストール )が入っていないとカラー表示できないので、注意!
コンソール!
たくさんあるよ!ライブラリ
ライブラリ!
とても紹介しきれないので、いくつか絞って。
役割 ライブラリ名 URL
XML ライブラリ (標準添付 )
REXML http://www.germane-software.com/software/XML/rexml/docs/tutorial.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という自由の羽を得た!!
飛び立とう!!
めくるめくオブジェクトの世界へ!!
カッコイイ事言います