Start!! Ruby

44
S S tart! tart! Ruby Ruby

description

1/30 に行った、 Thrive on development 勉強会で使用したスライドです。Rubyの基本について語っています。

Transcript of Start!! Ruby

Page 1: Start!! Ruby

SStart!tart! RubyRuby

Page 2: Start!! Ruby

SStart!tart! RubyRuby

偉そうにしてる人の自己紹介 名前:榎原明生

P.N. : MitiM(未知夢)

仕事:開発者やってます 主に業務系です 最近はホント何でも屋、MP以外はたいてい齧ってます 隠れ Agilerです

Ruby 暦:出会いは 1998年ごろ 当時は Unixで動かすのが当たり前という言語で、 Windows上に環境を構築するのが難しかった

プログラム:言語マニアの毛があります けっこう重度の TDDerかつ迷える TDDerです

なんでお前が喋るの?:なりゆきです!

Page 3: Start!! Ruby

・なぜ Ruby?

・ Smalltalkの思想を模倣した設計思想

・基本的な構文

・ Rubyらしさ

SStart!tart! RubyRuby

Page 4: Start!! Ruby

なぜ Ruby?

* 開発現場を効率良く回す

* OSSフレームワークを効果的に採用する

* 自動化できる部分はできうる限り自動化する

短期化する開発3ヶ月単位の開発が増えてきた!開発者は黙って徹夜休出を耐えるしかないのか?

Page 5: Start!! Ruby

なぜ Ruby?

自動化できる部分はできうる限り自動化する

* Ci等大きなツールは OSSを利用

* Dbにリソースを放り込むとか細かい糊的ツールが必要

-> つくらにゃ!

Page 6: Start!! Ruby

なぜ Ruby?

自動化するためにはツールをつくらにゃ!

* ツールのキモは「素早く実装」「使いながらメンテ」

* 開発対象の言語で作る! -> c#にしても Javaにしても重厚感はいなめない

* Excelのマクロ! -> nullと Nothingの嵐に眩暈が

* WindowsScriptingHostを使う! -> Officeは OLE …で使えるけど、ライブラリ不足が否めない

* LLは??

Page 7: Start!! Ruby

なぜ Ruby?

開発用ツールを LLで書くことの有用性Perl、 Python、 Ruby … とあるけれど

* 糊として手軽である

* 開発効率がとってもいい

* 大抵のライブラリが揃っている -> ライブラリマネージャ (cpan、 egg、 gem)で ネットから楽々インストール

で、なんで Rubyなの?

Page 8: Start!! Ruby

趣味です!!

なぜ Ruby?

Page 9: Start!! Ruby

Smalltalkの思想を模倣した設計思想

ほとんど全てがオブジェクト

* メソッドもオブジェクト

* クラス定義もオブジェクト * 詳しく:クラス構造の定義とグローバルオブジェクト化宣言を 同時に書いている

* nil(Javaの null)すらもオブジェクト * NullObjectパタンが簡単に!

Page 10: Start!! Ruby

Smalltalkの思想を模倣した設計思想

全てがオブジェクトだとどうなの?

* 全てが何かのクラスに所属している

* 全てに操作のためのメソッドが存在する

オブジェクトじゃないもの * 式 (メソッド扱いを除く )

* 制御構文 -> 「式」として扱われる

* 定義構文

* シンタックス・シュガー

Page 11: Start!! Ruby

Smalltalkの思想を模倣した設計思想

式? * 値を返すもの ・メソッド

・演算

・制御構文

Page 12: Start!! Ruby

Smalltalkの思想を模倣した設計思想

ほとんど全てがメソッド * 演算子もメソッド

・再定義が可能

・ ValueObjectの "=="は同値性を保証するのに大活躍

メソッドじゃない演算子= ?: .. ... ! not && and || or ::

Page 13: Start!! Ruby

Smalltalkの思想を模倣した設計思想

メッセージ・ドリブンDuckTyping - 「もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである」

* メッセージ・パッシングした先のオブジェクトが

・「何のクラスか」が大事なのではない

・「そのメソッドを持っている /持っていない」が大事

* 持ってなかったらどうなる?

・ NoMethodError が飛ぶ

Page 14: Start!! Ruby

基本的な構文

命名規則定数

大文字で始まる

変数

小文字で始まる

慣習1. クラス名はパスカル記法

2. メソッド名、変数名は _区切りの小文字

3. 定数名は _区切りの大文字

class HogeHoge

def hoge_hogehoge_hoge = 0

HOGE_HOGE = "hoge"

Page 15: Start!! Ruby

基本的な構文

変数とシンボル変数のスコープrubyのスコープの思想「最小単位はブロック (not メソッド、 not 式 )」

rubyの変数の思想「変数のスコープはなるべく局所化しろ」

スコープ=ブロック・ローカル

スコープ=インスタンス

スコープ=クラス

スコープ=グローバル

hoge

@hoge

@@hoge

$hoge

シンボル

同名の変数に対してリンクを張っている。

:hoge

Page 16: Start!! Ruby

基本的な構文

メソッドの定義引数なし

引数あり

複数の引数あり、初期化付き

可変長引数

メソッドのスコープは基本的にパブリック

def barkend

def bark(time)end

def bark(time, voice="ばう ")end

def bark(*voice)end

Page 17: Start!! Ruby

基本的な構文

クラスの定義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の面白いところ:クラスとは「クラスオブジェクトの定数」にしか過ぎない。

クラスオブジェクト??

クラス定義に従ってインスタンスを生成でき るインスタンス工場 のこと。

Page 18: Start!! Ruby

基本的な構文

クラスの定義ポイント

1. newは特別なメッセージ。メソッドとして独自定義できない。

2. initializeは newした時に自動で呼ばれるメソッド。引数を加えることができる。

3. 継承したい時は < [継承元 ] と記述する。

4. インスタンス変数を公開したい時は、 シンボルを使って、 attr_accessor、 attr_reader、 attr_writer を指定する

5. メソッドを非公開にしたいときは、シンボルを使って、 private、 protected を 指定する

6. クラスメソッド (staticなメソッド )を書くときは self.をメソッド名の前に付ける ※ この selfは、じつはクラスオブジェクト自身を指している

慣習1. クエリー系メソッドは、メソッド名の最後を "?"で終える。2. とくに ValueObjectで、インスタンスの内容を変更するメソッドは、 メソッド名の最後を "!"で終える。

Page 19: Start!! Ruby

基本的な構文

クラス・オブジェクトのインスタンス (メソッド /アトリビュート )へのアクセス基本は "." を使う

dog = CurDog.new("ポチ ")dog.bark("わおーん ")dog.wait

定数にアクセスする場合は "::"を使う

p CurDog::PEDIGREE

ちなみにメソッド呼び出し時の "()"は省略もできる

dog = CurDog.new "ポチ "dog.bark "わおーん "

ただし引数括りの ()は演算式括りの ()よりも優先度が高い

math.calc (a-b)+c

なんてやるとハマるから、要注意

Page 20: Start!! Ruby

制御構文

基本的な構文

コメント

# コメント

使える演算子

| ^ & <=> == === =~ > >= < <= << >>+ - * / % ** ~ +@ -@ [] []= `=+ =- =* =/ =% =**= ?: .. ... ! not && and || or ::

<=> 大小比較=== [左辺 ]に [右辺 ]が含まれるか=~ 正規表現で比較+= -= etc [左辺 ]に [右辺 ]を計算した結果を [左辺 ]に代入する(自己代入)ちなみに、 ++や -- は無い。

Page 21: Start!! Ruby

制御構文条件分岐許容条件

if 条件式 then 実行文elsif 条件式 then 実行文else 実行文end

実行文 if 条件式

否定条件

unless 条件式 then 実行文else 実行文end

実行文 unless 条件式

ケース条件

case 評価式when 式 then 実行文else 実行文end

基本的な構文

Page 22: Start!! Ruby

基本的な構文

制御構文繰り返し

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 が使える

Page 23: Start!! Ruby

制御構文

基本的な構文

例外構文例外を発生させる

raise 例外タイプ

raise 例外タイプ , メッセージ

raise メッセージ

例外ブロック

begin 実行文rescue 例外タイプ => 変数 then レスキュー文else 一般的なレスキュー文ensure クローズ文end

Page 24: Start!! Ruby

基本的な構文

制御構文ほかのファイルを組み込む組み込みたい位置

拡張子 ".rb"は不要。

基本的には、カレントディレクトリからの相対パスで指定する。ただし、 gemsでインストールしたライブラリの場合、たいていはライブラリ名だけで大丈夫。

そのかわり、次の requireを必ず入れること。

require 'ファイル名 'require 'ディレクトリ /ファイル名 '

require 'rubygems'

Page 25: Start!! Ruby

制御構文

基本的な構文

シンタックス・シュガーRubyは記述を簡便にするため、インスタンス生成に関するシンタックス・シュガーを用意している

Arrayのインスタンス生成

Hashのインスタンス生成

Stringのインスタンス生成

Regexpのインスタンス生成

Fixnumのインスタンス生成

Floatのインスタンス生成

array = [val1, val2]

hash = {key1=>val1, key2=>val2}

string = 'ruby'

regexp = /ruby/

num = 1

float = 0.1

Page 26: Start!! Ruby

基本的な構文

ここまでできたら

Javaでフツーにできる事は

できるようになる!

Page 27: Start!! Ruby

Rubyらしさ

文字列で遊ぼう!シンプルな文字列は ''を使う

string = 'これは文字列です。 '

ん~~、普通!

ちょっとフォーマットしたい時には ""を使う1. バックスラッシュ記法でコントロール文字を埋め込みたい2. 変数の値を文字列にフォーマッティングしたい

こんな用途に。age = 18string = "これは \n文字列です。 \nボク永遠の #{age}歳!! "

"#{}"の中は、かならず「式」として評価されるので、変数名がそのまま表記できる。ちなみに、単なる計算式でも OK

Page 28: Start!! Ruby

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 そのもの

Page 29: Start!! Ruby

Rubyらしさ

ここから先の前提知識:ブロックブロックとは ?

スコープ の最小単位

do 実行文end

{ 実行文}

または

{~ }の方が do~ endより少しだけ優先度が 高い

Page 30: Start!! Ruby

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の内容をすべて連結した文字列を返す

Page 31: Start!! Ruby

ブロック付きメソッド(いわゆるクロージャ)

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

Page 32: Start!! Ruby

Rubyらしさ

ブロック付きメソッド(いわゆるクロージャ)ブロック付きメソッドの作り方

def hoge 実行文 yield 実行文end

def hoge 実行文 yield(item) 実行文end

引数があるときは

Page 33: Start!! Ruby

Rubyらしさ

動性の高い Rubyのリフレクションリフレクションという認識すらないくらい、「普通のこと」になっている。これもまた、動的言語で「すべてがオブジェクト」の世界観が成せる技。次のような動的拡張が可能になっている。

既存のクラスにメソッドを拡張する既存の Arrayクラスに hogeというメソッドを追加する場合、次のように書けば良い。class Array def hoge endend

これ、なんと組み込みクラスにも可能。

もちろん、既存のメソッドを書き換えることも可能!

Page 34: Start!! Ruby

Rubyらしさ

動性の高い Rubyのリフレクション既存のオブジェクトにメソッドを拡張するクラスにメソッドを拡張すると、なにかとメンドクサイ問題が出る場合がある。そんな時は、対象となるオブジェクトにだけメソッドを拡張する。array = []

def array.hogeend

Page 35: Start!! Ruby

Rubyらしさ

動性の高い Rubyのリフレクションいちいち一個ずつメソッドを書き換えたり、メンドクサくない?って時にはMixInモジュールとは「機能的に同じものをまとめて定義しておく」機能のこと。

クラスとは違い、継承ができないし、インスタンスの生成もできない。

「 GUIでのコントローラをモジュールで表現」のような使い方をする。

「そのクラスの直接的な機能じゃないけれど、副次的に必要になるユーティリティ的機能」などをモジュール化しておくと、なにかと便利。

Page 36: Start!! 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 :keyend

動性の高い Rubyのリフレクション

Rubyらしさ

というモジュールをつくっておいて

たとえば

Page 37: Start!! Ruby

GUIで「このクラスをリスト表示したい!」というときにさらっと

動性の高い Rubyのリフレクション

Rubyらしさ

class Section include KeyNameListItemend

というように、クラス再定義 で組み込んでしまえる。

もちろん、オブジェクトにもMixIn

section = Section.new section.extend KeyNameListItem

Page 38: Start!! Ruby

…これらの再定義をうまく使っていくと

Javaや C#にありがちな

XxxUtil

とか

XxxHelper

とかいったクラスが必要ないという事に気づくはず!

Rubyらしさ

動性の高い Rubyのリフレクション

Page 39: Start!! Ruby

Rubyでもドキュメンテーション

RDocを使ってみよう!

修飾してみよう!

RDocの "書きどころ "は、 JavaDocなどと同じ。クラスの前、メソッドの前、シンボルの前、ファイルのトップなど。

# ドキュメンテーションと、コメントのように書くだけで OK 。

作成者やライセンス情報などの書き方

#Authors:: MitiM#Version:: 1.0#Copyright:: Copyright (C) MitiM, 2010. All rights reserved.#License:: Ruby License

基本的に ::で区切れば、好きな項目を作成可能。

Page 40: Start!! Ruby

Rubyでもドキュメンテーション

RDocを使ってみよう!修飾してみよう!見出し <H1>~ <H3>は

#= 見出しレベル 1#== 見出しレベル 2#=== 見出しレベル 3

箇条書きは、 -(*)で・。 +でナンバリン グ。

#- レベル 1# - レベル 2#+ レベル 1# + レベル 2

RDoc 内でコメントにしたいなら

#--# この中はドキュメンテーションされない#++

RDocとして書き出すのは$ rdoc [ソースファイル .rb]

Page 41: Start!! Ruby

コンソール!

これだけは覚えておきたい!コマンドコンソールでいろいろ試す

$ irb

コンソール上でインタラクティブに実行できる Ruby。ソースの保存以外は何でも「 Rubyのソースのように」記述し、その場で実行できる。

こんな構文、できるの?この動きは何?迷ったときは、まず irb!

ドキュメントを見る$ ri [クラス名 ]#[メソッド名 ]

.区切りでも OK。英語だけれど、知りたいクラスやメソッドがその場でわかる。

Page 42: Start!! Ruby

これだけは覚えておきたい!コマンドライブラリをダウンロードする$ gem install [ライブラリ名 ]

空白区切りで、複数ライブラリを一気にダウンロードすることも可能。ちなみに、依存ライブラリがあった場合は、勝手にダウンロードされる。$ gem list

で、インストールされているライブラリの一覧も表 示可能。

RSpecでテストをする$ spec -c -fs [テストコード名 ]

いちいちテストの説明を見なくてもいいときは、 -fsを外す。

Windowsは win32console(gemでインストール )が入っていないとカラー表示できないので、注意!

コンソール!

Page 43: Start!! Ruby

たくさんあるよ!ライブラリ

ライブラリ!

とても紹介しきれないので、いくつか絞って。

役割 ライブラリ名 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) …… の中に

Page 44: Start!! Ruby

…最後に

さあ!いま、 Rubyという自由の羽を得た!!

飛び立とう!!

めくるめくオブジェクトの世界へ!!

カッコイイ事言います