ruby入門 - ecl.info.kindai.ac.jpecl.info.kindai.ac.jp/~inotti/zemi_3/ruby_instruction.pdf ·...
TRANSCRIPT
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
Ruby入門Ruby入門
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
流れ流れ
Rubyの文法Rubyの文法
�� 画面に出力画面に出力
�� キーボードから入力キーボードから入力
�� 数値、文字列数値、文字列
�� 変数変数
�� 配列、ハッシュ配列、ハッシュ
�� 制御構造(分岐・繰り返しなど)制御構造(分岐・繰り返しなど)
–– ifif、、 whilewhile、、casecase、、 forfor、、eacheach
�� 関数関数
�� クラスクラス
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
RubyとはRubyとは
�� プログラミング言語プログラミング言語
�� インタプリタ言語インタプリタ言語
��オブジェクト指向オブジェクト指向
��国産国産
��ウェブアプリケーションフレームワークウェブアプリケーションフレームワーク
RubyOnRailsで注目RubyOnRailsで注目
––弊社でのWebアプリケーション開発に利用弊社でのWebアプリケーション開発に利用
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
画面に出力画面に出力
puts puts ““hello world.hello world.””
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
キーボードから入力キーボードから入力
gets
例) puts gets # 入力をそのまま画面に出力
“abc” と入力する場合、gets では ”abc¥n” のように 改行コード が最後に入る。
これを取り除くには、 gets.chomp とする。
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
四則演算四則演算
単純な例:単純な例:
�� puts 1 + 1puts 1 + 1 #=> 2#=> 2
�� puts 3 puts 3 –– 11 #=> 2#=> 2
�� puts 1 * 2puts 1 * 2 #=> 2#=> 2
�� puts 10 / 5puts 10 / 5 #=> 2#=> 2
�� puts 10 % 2puts 10 % 2 #=> 5#=> 5
複雑な例:複雑な例:
�� puts 1 + ( 1 puts 1 + ( 1 –– 2 * ( 4 2 * ( 4 –– 1 ) ) 1 ) ) #=> #=> --44
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
文字列文字列
puts puts ““文字列文字列”” #=> #=> 文字列文字列
puts puts ‘‘これも文字列これも文字列’’ #=> #=> これも文字列これも文字列
�� エスケープシーケンスエスケープシーケンス
puts puts ““改行は改行は¥¥nnこうするこうする””
#=> #=> 改行は改行は
こうするこうする
puts puts ‘‘これだとこれだと¥¥nn改行されない改行されない’’ #=> #=> これだとこれだと¥¥nn改行されない改行されない
puts puts ‘‘これにこれに¥¥’’注目注目¥¥’’してしてほしいほしい’’ #=> #=> これにこれに’’注目注目’’してほしいしてほしい
�� 文字列文字列文字列文字列のののの結合結合結合結合文字列文字列文字列文字列のののの結合結合結合結合
puts puts ““こんにちはこんにちは”” + + ““こんばんはこんばんは””
#=> #=> こんにちはこんばんはこんにちはこんばんは
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
数値と文字列の変換数値と文字列の変換
�� 文字列を数値へ文字列を数値へ
–– ““100100””..to_ito_i # # 整数整数
–– ““12.512.5””..to_fto_f ## 浮動小数点数浮動小数点数
�� 数値を文字列へ数値を文字列へ
–– 100.100.to_sto_s
�� 変換しないといけない例:変換しないといけない例:
a = 1a = 1 ; b = ; b = ““22”” ; puts a + b; puts a + b
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
RubyRubyの変数の変数
��変数を宣言しなくてよい変数を宣言しなくてよい
––実際に使用するときにいきなり使える実際に使用するときにいきなり使える
num = 3num = 3
��変数には型がない変数には型がない
––中に入っているオブジェクトが動的に変化中に入っているオブジェクトが動的に変化
a = 1a = 1
a = a = ““foofoo”” # # 数値が入っていたところに文字列を代入数値が入っていたところに文字列を代入
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
変数の使用例変数の使用例
�� 変数に値を代入変数に値を代入
num = 1num = 1
strstr = = ““文字列文字列””
�� 変数の値を出力変数の値を出力
puts numputs num #=> 1#=> 1
puts puts strstr #=> #=> 文字列文字列
�� 変数から変数に代入変数から変数に代入
strstr = num= num
puts puts strstr #=> 1 (#=> 1 (数値数値))
�� 変数で計算変数で計算
puts puts strstr + num+ num #=> 2 (#=> 2 (数値数値))
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
変数と四則演算変数と四則演算
��変数に特定の値を加減乗算する変数に特定の値を加減乗算する
a += 4a += 4
a a --= 4= 4
a *= 4a *= 4
a /= 4a /= 4 # 0 # 0 を指定するとエラーが起こるを指定するとエラーが起こる
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
配列配列
�� 宣言・初期化宣言・初期化
a = [] a = [] ((空の配列)空の配列)
a = [1,2,3]a = [1,2,3]
�� 追加追加
a << 4a << 4
a += []a += []
�� 参照参照
a[0]a[0]
a.firsta.first ((一番はじめの要素)、一番はじめの要素)、a.lasta.last ( (一番最後の要素)一番最後の要素)
�� 配列の中身の個数配列の中身の個数
a.sizea.size
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
ハッシュハッシュ
�� key key とと value value のペアを格納する配列のペアを格納する配列
�� 別名・連想配列別名・連想配列
�� jankenjanken = { # key => value= { # key => value
““グーグー”” => 0,=> 0,
““チョキチョキ”” => 1,=> 1,
““パーパー”” => 2 }=> 2 }
�� jankenjanken[[““パーパー””] ] #=> 2#=> 2
–– keykeyを添え字にすると、ペアになっているを添え字にすると、ペアになっているvaluevalueが返るが返る
�� 使用例:英日辞書プログラム使用例:英日辞書プログラム
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
制御構造制御構造
��比較比較
•• a a << bb : a : a はは b b より小さいより小さい
•• a a <=<= bb : a : a はは b b 以下以下
•• a a =>=> bb : a : a はは bb 以上以上
•• a a >> bb : a : a はは b b より大きいより大きい
•• a a ==== bb : a : a とと b b は等しいは等しい
•• a a !=!= bb : a : a とと b b は等しくないは等しくない
•• 条件を満たす場合は条件を満たす場合は true(true(真)真)
•• 満たさない場合は満たさない場合は false(false(偽偽))
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
制御構造制御構造
�� 条件分岐条件分岐
–– if if 文文
a = 1a = 1
ifif a == 1a == 1
puts puts ““11ですです””
elsifelsif a == 2a == 2
puts puts ““22ですです””
elseelse
puts puts ““11でもでも22でもありませんでもありません””
endend
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
制御構造制御構造
��複数条件分岐複数条件分岐
–– casecase文文case numcase numwhen 1when 1puts puts ““11ですです””
when 2, 4, 6when 2, 4, 6puts puts ““2,4,62,4,6のどれかですのどれかです””
when 4..7when 4..7puts puts ““4~74~7の範囲ですの範囲です””
elseelseputs puts ““条件以外です条件以外です””
endend
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
制御構造制御構造
��繰り返し繰り返し
–– while while 文文
while a < 10while a < 10
puts aputs a
a += 1a += 1
endend
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
制御構造制御構造
��繰り返し繰り返し
–– uptoupto 文文
0.0.upto(10) { |i|upto(10) { |i|
puts iputs i
}}
※※ CC言語の言語の for( for( intint i = 0; i <= 10; i+){i = 0; i <= 10; i+){・・・・・・}}
に相当に相当
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
制御構造制御構造
��繰り返し繰り返し
–– times times 文文
�� 100100回繰り返す回繰り返す
�� i i はは00からスタートからスタート
100. 100. times { |i|times { |i|
puts iputs i
}}
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
制御構造制御構造
��配列の繰り返し配列の繰り返し
–– eacheachメソッドメソッド
a = [1,2,3,4,5]a = [1,2,3,4,5]
a.eacha.each { |{ |varvar||
puts puts varvar
}}
–– forfor文文
for ( for ( varvar in a )in a )
puts puts varvar
endend
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
メソッド(関数)メソッド(関数)
��今までに出てきたメソッド今までに出てきたメソッド
––putsputs, , getsgets
––gets.gets.chompchomp
––““11””..to_ito_i, , ““11””..to_f to_f ((文字列クラスのメソッド)文字列クラスのメソッド)
––1.1.to_s to_s ((数値クラスのメソッド)数値クラスのメソッド)
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
メソッドの作り方メソッドの作り方
��関数の定義関数の定義
defdef plus(aplus(a, b), b)
returnreturn a + ba + b
endend
��利用利用
puts plus( 10, 12 )puts plus( 10, 12 ) #=> 22#=> 22
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
return return の省略の省略
�� メソッドの最後に書いた行の値が戻り値になるメソッドの最後に書いた行の値が戻り値になる
def def plus( a, b, c )plus( a, b, c )
ans = 0ans = 0ans += aans += aans += bans += b
ans += cans += c
returnreturnreturn ansans # return # return が省略されているが省略されている
endend
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
定数定数
��大文字で始まる変数大文字で始まる変数
MAX_VALUE = 10MAX_VALUE = 10
�� メソッドの中では定義できないメソッドの中では定義できない
��一度初期化あとに再度代入しようとすると警一度初期化あとに再度代入しようとすると警
告がでる(エラーではないが非推奨)告がでる(エラーではないが非推奨)
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
クラスクラス
�� オブジェクトの定義オブジェクトの定義
�� クラス定義クラス定義
–– 例: 挨拶クラス例: 挨拶クラス
classclass Greeting1Greeting1 ## クラス名は必ず大文字ではじめるクラス名は必ず大文字ではじめる
# # インスタンスメソッドインスタンスメソッド
defdef greetgreet # # メソッド名は小文字で、単語ごとにメソッド名は小文字で、単語ごとに””__””で区切るで区切る
returnreturn ““こんにちはこんにちは””
endend
endend
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
クラスクラス
�� インスタンスの生成インスタンスの生成
varvar = Greeting1.new= Greeting1.new
varvarに生成されたに生成されたGreetingGreetingクラスのインスタンスが入っているクラスのインスタンスが入っている
�� インスタンスメソッドの呼び出しインスタンスメソッドの呼び出し
puts puts var.greetvar.greet #=> #=> ““こんにちはこんにちは””
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
クラスクラス
�� 挨拶する相手の名前を入力できるようにする挨拶する相手の名前を入力できるようにする
�� classclass Greeting2Greeting2attr_accessorattr_accessor ““namename”” # # アクセッサアクセッサ
defdef greetgreet
returnreturn ““こんにちは、こんにちは、”” + @+ @name + name + ““さんさん””
endend
# # 特殊なメソッド特殊なメソッド
defdef initialize(nameinitialize(name))
@name = name@name = name # # 挨拶をする相手の名前挨拶をする相手の名前
endend
endend
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
クラスクラス
�� initializeinitializeメソッドメソッド
インスタンスを生成するときに、インスタンスの初期化処理を行インスタンスを生成するときに、インスタンスの初期化処理を行
う場合に定義う場合に定義
�� インスタンス変数インスタンス変数
–– @@hogehoge のように、@から始まる変数のように、@から始まる変数
–– インスタンスごとに保持している値が異なるインスタンスごとに保持している値が異なる
–– インスタンス変数はインスタンスの外から使えないインスタンス変数はインスタンスの外から使えない
�� アクセッサアクセッサ
–– インスタンス変数をインスタンスの外から使えるようにするたインスタンス変数をインスタンスの外から使えるようにするた
めの定義めの定義
–– attr_accessorattr_accessor ““namename”” で定義するで定義する
–– greeting_instance.namegreeting_instance.name で値を取得したり、代入したりできで値を取得したり、代入したりでき
るようになるるようになる
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
クラスメソッドクラスメソッド
�� インスタンスを生成せずに実行できるメソッドインスタンスを生成せずに実行できるメソッド
classclass Greeting2Greeting2
# # 省略省略
defdef selfself.ask_name.ask_name
returnreturn ““あなたのお名前は何ですか?あなたのお名前は何ですか?””
endend
endend
�� クラス名クラス名..メソッド名メソッド名 で実行で実行
puts Greeting2.ask_nameputs Greeting2.ask_name
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
クラスの定数クラスの定数
�� クラスの中で定数を定義すると、クラスの中でクラスの中で定数を定義すると、クラスの中で
のみ有効な定数になるのみ有効な定数になる
classclass FooFoo
HOGE = HOGE = ““hogehoge””
endend
�� クラス外から参照する場合は、クラス外から参照する場合は、
Foo::HOGEFoo::HOGE
と記述すると参照できると記述すると参照できる
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
クラスの継承クラスの継承
��親クラスのメソッドやインスタンス変数を受け親クラスのメソッドやインスタンス変数を受け
継いだクラスを定義継いだクラスを定義
classclass MyGreetingMyGreeting < Greeting1< Greeting1
# # なにもメソッドは定義していないなにもメソッドは定義していない
endend
��利用利用
a = a = MyGreeting.newMyGreeting.new
a.greeta.greet #=> #=> 親クラスのメソッドが呼ばれる親クラスのメソッドが呼ばれる
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
メソッドのオーバーメソッドのオーバーライドライド
�� 親クラスで定義されているメソッドを再定義する親クラスで定義されているメソッドを再定義する
classclass EnglishGreetingEnglishGreeting < Greeting2< Greeting2
defdef greetgreet
returnreturn ““Hello Hello ““ + @name + + @name + ““..””
endend
def def self.self.ask_nameask_name
return return ““What is your name ?What is your name ?””
endend
endend
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
挨拶クラスを使った例挨拶クラスを使った例
puts puts ““Can Can you speak you speak JapaneseJapanese?? (yes/no)(yes/no)””
ifif gets.chompgets.chomp == == ““yesyes””
puts Greeting2.ask_nameputs Greeting2.ask_name
g = Greeting2.new g = Greeting2.new gets.chompgets.chomp # # 日本語の挨拶日本語の挨拶
elseelse
puts puts EnglishGreeting.ask_nameEnglishGreeting.ask_name
g = g = EnglishGreeting.newEnglishGreeting.new gets.chompgets.chomp ##英語の挨拶英語の挨拶
endend
puts puts g.greetg.greet ## 選んだほうの言葉で挨拶する選んだほうの言葉で挨拶する
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
RubyRubyの組み込みクラスの組み込みクラス
�� 数値クラス数値クラス
–– 整数型クラス整数型クラス ((Integer {Integer {FixnumFixnum, , BignumBignum})})
–– 浮動小数点型クラス浮動小数点型クラス ((Float)Float)
�� 文字列クラス文字列クラス ((String)String)
�� シンボルクラス(シンボルクラス(Symbol)Symbol)
�� 配列クラス配列クラス ((Array)Array)
�� ハッシュクラスハッシュクラス ((Hash)Hash)
�� nilnilクラスクラス ((NilClassNilClass))
�� BoBoooleanlean–– truetrueクラス(クラス(TrueClassTrueClass))
–– falsefalseクラスクラス((FalseClassFalseClass))
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
BooleanBoolean
��真真 or or 偽 の値をとる偽 の値をとる
��真:真: truetrue
��偽:偽: falsefalse
��比較演算をすると生成される比較演算をすると生成される
–– 100 > 10 100 > 10 #=> #=> truetrue
–– 10 > 10010 > 100 #=> false#=> false
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
シンボル:シンボル:SymbolSymbol
��文字列クラスはインスタンスごとにオブジェク文字列クラスはインスタンスごとにオブジェク
トが違うトが違う
a = a = ““foofoo””
b = b = ““foofoo””
は別のインスタンスになるは別のインスタンスになる
�� シンボルではシンボルでは
a = :a = :foofoo
b = :b = :foofoo
は同じインスタンスになるは同じインスタンスになる
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
nil(NilClassnil(NilClass))とは?とは?
��空を意味するオブジェクト空を意味するオブジェクト
��次のような場合によく出現する次のような場合によく出現する
––戻り値を返さない関数の戻り値戻り値を返さない関数の戻り値
––配列やハッシュで値がない要素を参照配列やハッシュで値がない要素を参照
��例例
array = []array = []
array[2]array[2] #=> nil#=> nil
##値がないので値がないのでnilnilが返るが返る
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
ブロックブロック
�� do do ~~ end end までのプログラムをオブジェクトにしたものまでのプログラムをオブジェクトにしたもの((このオこのオ
ブジェクトを手続きオブジェクトというブジェクトを手続きオブジェクトという))
�� 他の言語にはあまりない特殊な機能他の言語にはあまりない特殊な機能
�� 作成作成
hello = hello = Proc.newProc.new dodo
puts puts ““hellohello””
endend
# # 別の書き方:別の書き方:
hello2 = hello2 = procproc { puts { puts ““hellohello”” }}
�� 利用利用
hello.callhello.call #=> #=> ““hellohello”” と表示されると表示される
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
ブロックブロック
�� ブロックに引数を渡すこともできるブロックに引数を渡すこともできる
greet = proc { |message|greet = proc { |message|
puts messageputs message
}}
greet.callgreet.call ““こんばんはこんばんは””
#=> #=> ““こんばんはこんばんは”” と表示と表示
greet.callgreet.call ““さようならさようなら””
#=> #=> ““さようならさようなら””と表示と表示
2007/7/312007/7/31 (c) (c) チャイナ保証ネットワーク株式会社チャイナ保証ネットワーク株式会社
ブロックブロック
�� 配列の配列のeacheachメソッドや、数値クラスのメソッドや、数値クラスのuptouptoメソッドのメソッドの {|{|i| }i| } は は do |i| do |i| ~~ end end の別の書き方(若干違いはある)の別の書き方(若干違いはある)
0.0.upto(10) { |i|upto(10) { |i|
}}
0.upto(10) 0.upto(10) dodo |i||i|
endend
は同じ動作。は同じ動作。