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という自由の羽を得た!! 飛び立とう!! めくるめくオブジェクトの世界へ!! 最後に…
© Copyright 2024 ExpyDoc