Ruby言語基礎演習 社会人技術者研修テキスト

Ruby基礎演習
1
2-1_Ruby言語基礎演習.indd 1
15/02/06 9:55
Ruby基礎演習
2
2-1_Ruby言語基礎演習.indd 2
15/02/06 9:55
目的
ますます注目されている国産プログラミング言語Rubyについて、
基本的な言語の概要と、一般的に利用される要素について解説、
本テキストはその解説補助とするものです
達成目標
Ruby言語の基礎的な部分の理解
インタプリタ型言語の特色を活かし対話的にプログラミング実習
既にあるコードを読んでいけるまでの理解
その後、各自がさらに習熟をすすめていけるところまでを目標
社会人技術者研修 2014年度テキスト
Ruby基礎演習
2
3
2-1_Ruby言語基礎演習.indd 3
15/02/06 9:55
1. Rubyについて
1.1. Rubyの基礎知識
Rubyは、手軽にオブジェクト指向プログラミングができるスクリ
プト言語です。
近年ではWebアプリケーション開発用として登場したフレームワー
ク「Ruby on Rails」の普及により、メジャーな開発言語の1つと
なっています。
→ Rubyとは https://www.ruby-lang.org/ja/about/
!
1.2. 主な特徴
・インタプリタ言語
・簡潔で綺麗な記述の文法
・オブジェクト指向言語
・オープンソース、無料
・マルチプラットフォーム
・Ruby on Rails の他、多種のプラッットフォームやライブラリ
・日本発祥の開発言語(まつもとゆきひろ氏)
社会人技術者研修 2014年度テキスト
Ruby基礎演習
3
4
2-1_Ruby言語基礎演習.indd 4
15/02/06 9:55
1.3. Rubyのインストール
様々なインストール方法がある
まずは本家Ruby.org(https://www.ruby-lang.org/ja/)を確認、
各OS環境でインストールできる情報から調べてみるとよい
- バージョン
1.8系
1.9系
2.0系以降(最新は2.1系)
現在は2.0以降が主
※OSによっては標準でインストールされているが、バージョンが
古いケースもある。ただし基本的な記述の大幅な変化は少ない
!
1.4. テキストエディタについて
普通のテキストエディタでとりあずは始められる
開発者がよく使うエディタでは
・sublime text
・emacs
・vim
・rubymine
・eclipse
などが使われています。
社会人技術者研修 2014年度テキスト
Ruby基礎演習
4
5
2-1_Ruby言語基礎演習.indd 5
15/02/06 9:55
!
1.5. コマンドプロンプトの操作
本演習では各OSのコマンドライン(DOSプロンプト等)を利用
します。各OSのコマンド操作の基礎的な操作を必要とします
・Windows → コマンド
・MacOS → ターミナル
!
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
5
6
2-1_Ruby言語基礎演習.indd 6
15/02/06 9:55
2. さっそく動かしてみる
2.1. 最初のプログラム
テキストエディタを使って下のコードを入力し、
「hello.rb」という名前で保存してください。
hello.rb
!
puts "Hello! Ruby”
ファイル保存後、コマンドラインから以下のようにで実行します
>ruby hello.rb (リターン)
すると以下のように画面出力されます。
このプログラムでは、ただ文字を画面に出力するだけの動作です。
> ruby hello.rb
Hello! Ruby
2.2.コメント記述
プログラムの記述意外に、メモや注釈を入れてみます。
# はじめてのrubyプログラム
puts "Hello! Ruby"
Ruby言語におけるコメント記述は 半角 # から続く行の終わりまで
が対象となります。実行してみましょう。
> ruby hello.rb
Hello! Ruby
!
コメント行は何も実行しないので、同じ結果となります。
(他に =begin ~ =end 記述の方法もあります)
社会人技術者研修 2014年度テキスト
Ruby基礎演習
6
7
2-1_Ruby言語基礎演習.indd 7
15/02/06 9:55
!
2.3.セミコロン記述
通常は1行で1つの処理ですが、セミコロン「;」を改行の替わり
に使う事も出来ます。
!
puts "Hello! Ruby”; puts ”Bye!”
(実行結果)
> ruby hello.rb
Hello! Ruby
Bye!
2.4.ワンライナー実行
コマンドラインから1行だけRubyプログラムを実行することがで
きます。
>ruby -e 'puts "Hello world"'
Hello world
2.5.対話環境(irb)
Rubyの実行を対話的に操作する環境があります。命令実行を確認
したりする場合にはこちらが便利です。
>irb
irb(main):001:0> puts "Hello world"
Hello world
=> nil
irb(main):002:0>
!
終了するには exit か quit を入力
社会人技術者研修 2014年度テキスト
Ruby基礎演習
7
8
2-1_Ruby言語基礎演習.indd 8
15/02/06 9:55
3. 変数と定数
3.1.文字列 文字列はダブルコーテーション、またはシングルコーテーションで
囲み、次のように代入します
str = "Hello"
str = ‘Hello'
※ダブルコーテーションをシングルコーテーションで囲むと
ダブルコーテーションも文字列に含まれます�その逆も可
特殊文字(他にもありますが略)
¥t
¥n
¥r
¥f
¥s
タブ
改行
リターン
改ページ
空白
以下のように記述します
puts "Hello!¥nBye!”
> ruby hello.rb
Hello!
Bye!
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
8
9
2-1_Ruby言語基礎演習.indd 9
15/02/06 9:55
3.2.数値
整数値の記述だと整数、小数点以下が含まれると小数拡張して扱わ
れることに注意。
fig2.rb
# 変数num1に整数123を代入、num2に小数10.8を代入
num1 = 123 # 整数
num2 = 10.8 # 小数
(その他)
0x1fff
0b1011
4e20
# 16進
# 2進
#�指数
3.3.変数
変数は小文字または`_'で始まる識別子で記述、
Rubyには型宣言が無い(全てがオブジェクト)
ローカル変数
foo = 1
foo = "FOO"
_value = 100
# 数値代入
# 文字列代入
グローバル変数は戦闘が$
$bar = 999
インスタンス変数、クラス変数(後述)
@value = 123
@@test = 0
!
# インスタンス変数
# クラス変数
※Rubyの変数はその値を指すメモリ領域ということに注意
!
(参考: 値渡しと参照渡しの違いを理解する�ー Rubyist Magazine)
→�http://magazine.rubyist.net/?0032-CallByValueAndCallByReference
社会人技術者研修 2014年度テキスト
Ruby基礎演習
9
10
2-1_Ruby言語基礎演習.indd 10
15/02/06 9:55
3.4.定数
アルファベット大文字で始まる識別子が定数
FOO = 'FOO'
※true,falseについては予約語(疑似変数)として予約済み
true (真)
false (偽)
3.5.nil値
nil は「値のない状態」を示す
foo = nil
他言語におけるNULL等に相当
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
10
11
2-1_Ruby言語基礎演習.indd 11
15/02/06 9:55
4. 演算子
4.1.四則演算など
演算子の記述
*
/
+
%
**
!
乗算
除算
加算 減算 剰余
べき乗
d = 100 + 23 # ans. 123 演算子の優先順位
参考 http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2foperator.html
4.2.代入演算子
動作例
!
d = 100
d += 1 # => 101
d -= 1 # => 100
d *= 2 # => 200
d **= 2 # => 4000
※インクリメント、デクリメント演算子はRubyにはありません
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
11
12
2-1_Ruby言語基礎演習.indd 12
15/02/06 9:55
4.3.その他の演算子
演算子の記述
=
&& and
|| or
! not
..
...
::
?:
代入演算子(これも演算として考える)
論理演算子
論理演算子
論理演算子
範囲演算子
範囲演算子
スコープ演算子
条件演算子
社会人技術者研修 2014年度テキスト
Ruby基礎演習
12
13
2-1_Ruby言語基礎演習.indd 13
15/02/06 9:55
5. 条件分岐
5.1.if式
記述
if 条件式 then
式
else
式
end
!
※then表記、else式 は省略できます
!
動作例
fig4.rb 今が午後か午前かを表示
# coding: UTF-8
hour = Time.now.hour # 時刻を得る
if hour >= 12
p "今は午後です"
else
p "今は午前です"
end
社会人技術者研修 2014年度テキスト
Ruby基礎演習
13
14
2-1_Ruby言語基礎演習.indd 14
15/02/06 9:55
5.2.if修飾式
文の末尾にif式を置く事で、そのif式の結果により前方の文の実行
が行われます。
記述
!
式 if 条件式
動作例
!
puts "ok" if true
# => “ok”
通常のif式構文より凝縮して記述ができる。Rubyの特徴
5.3.unless式
unless式は、if文の真偽逆の動きを行う
記述
unless 条件式 then
式
else
式
end
!
!
式 unless 条件式
(if not を使うか、unlessを使うかは好みの問題)
社会人技術者研修 2014年度テキスト
Ruby基礎演習
14
15
2-1_Ruby言語基礎演習.indd 15
15/02/06 9:55
5.4.条件演算子
C言語での三項演算子と同類
記述
!
評価式 ? 式 : 式
動作例
age = 20
puts (age < 20) ? "ng" : “ok"��# => “ok”
!
!
a = true ? "ok" : "ng"
puts a # => "ok"
if修飾式と同様に凝縮した記述ができる
社会人技術者研修 2014年度テキスト
Ruby基礎演習
15
16
2-1_Ruby言語基礎演習.indd 16
15/02/06 9:55
5.5.case式
C言語やJavaでのswitch~case文等に相当
記述
case 評価対象
when 値1 then
値1と一致する場合に行う処理
when 値2 then
値2と一致する場合に行う処理
else
どの値にも一致しない場合に行う処理
end
!
thenは省略可能
※C言語におけるbreak記述はなく、when、elseの中の処理後は必
ずendへ抜けます。
fig5.rb case記述例
!
num = 150
case num
when 1
p "a"
when 2,3,4
p "b"
when 100..200
p "c"
else
p “???"
end
# 複数指定
# 範囲指定
# => "c"
詳細参考
!
http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fcontrol.html
社会人技術者研修 2014年度テキスト
Ruby基礎演習
16
17
2-1_Ruby言語基礎演習.indd 17
15/02/06 9:55
6. 繰り返し処理
6.1.while式
記述
while 評価式 do
end
!
動作例
!
n=1
while n <= 3 do
puts n # 1,2,3の順で表示出力
n += 1
end
6.2.for式
記述
for 識別子 in 式�do
end
!
動作例
!
for n in 1..3�do # 1..3 は1から3を示す範囲記述
puts n
end
社会人技術者研修 2014年度テキスト
Ruby基礎演習
17
18
2-1_Ruby言語基礎演習.indd 18
15/02/06 9:55
6.3.範囲オブジェクト等
記述例
1..10
# 1から10までの整数の集合を示す表現
!
[1,2,3,4]
# 配列表現
!
{ "apple" => 1, "orange" => 2, "banana" => 3 }
# ハッシュ表現
!
6.4.eachメソッド
記述
オブジェクト.each do |識別子|
end
# ※オブジェクトは範囲オブジェクトや配列など
!
動作例
a = [1,3,5] a.each do |n|
puts n� # 1,3,5と出力
end
社会人技術者研修 2014年度テキスト
Ruby基礎演習
18
19
2-1_Ruby言語基礎演習.indd 19
15/02/06 9:55
6.5.その他の繰り返し式
他にも様々な記述がある
fig6.rb 繰り返し式記述例
!
# 5回繰り返し
5.times {
puts "hello"
}
!
# 3から7まで昇順に繰り返し
3.upto(7) {|n|
puts n
}
!
# 3から-2まで降順に繰り返し
3.downto(-2) {|n|
puts n
}
!
!
# 3から9まで2刻みで繰り返し
3.step(9,2) {|n|
puts n
}
※do~endはと{~}の記述は同義
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
19
20
2-1_Ruby言語基礎演習.indd 20
15/02/06 9:55
6.6.ループ脱出等
break ー 脱出
next ー ループの最初に戻る
!
fig7.rb ループ脱出記述例
!
(1..10).each {|n|
break if n > 4
pn
count = n
}
p "break."
# breakでループを抜ける(if修飾子との組み合わせ)
# 1,2,3だけ表示される
!
!
!
p "next:"
(1..10).each do |n|
next if n < 4
# ループの最初に戻る
pn
# 1,2,3は表示されない
end
社会人技術者研修 2014年度テキスト
Ruby基礎演習
20
21
2-1_Ruby言語基礎演習.indd 21
15/02/06 9:55
7. 配列とハッシュ
7.1.配列
fig8.rb 配列操作例
!
配列と要素参照
a = [1, 2, 3, 9 , -1]
puts a[0] # => 1
puts a[3] # => 9
puts "max = #{a.max}"
!
# 一次元配列の格納
# 要素の参照
# 配列の中の最大値を得る
文字列の配列格納と参照
b = [ "apple", "banana", "orange" ]
puts b[2]
# => orange
puts b[4].nil?
# => true
puts "length = #{b.length}"
# => 3
!
異なる型の配列格納と参照
!
c = [ "abcd", 3, "aaaa", 4.56 ]
c[2] = 10
c[3] = [ 1, 2, 3]
# 配列の中に配列要素も格納できる
c[1] = 1..5
c.each do |obj|
p obj
end
# 1..5, 10, [1,2,3], 4.56 が表示される
社会人技術者研修 2014年度テキスト
Ruby基礎演習
21
22
2-1_Ruby言語基礎演習.indd 22
15/02/06 9:55
7.2.ハッシュ
fig9.rb ハッシュ操作例
!
ハッシュ (JavascriptやPHPの連想配列と同類)
a = {"taro" => 18, "ken" => 20}
p a["taro"]
# => 18
p a["hoge"]
# => nil (該当がない)
!
ハッシュの代入
!
a["hanako"] = “unknown"
ハッシュの列挙参照
a.each do |key, value|
# 20以上の要素だけ表示
p "name: #{key} age: #{value}" if value.to_i > 19
end
!
ハッシュを配列に変換
!
pa
p a.to_a
# =>{"taro" => 18, "ken" => 20, ”hanako”=> "unknown"}
# =>[[“taro” => 18], [“ken" => 20], [hanako”=> “unknown”]]
社会人技術者研修 2014年度テキスト
Ruby基礎演習
22
23
2-1_Ruby言語基礎演習.indd 23
15/02/06 9:55
8. メソッドとクラス
8.1.メソッド
C言語などの「関数」にあたるものをRubyでは「メソッド」と呼
びます。
fig10-1.rb メソッド基本
!
def testfunc # 引数のない場合は括弧の省略可
"Hello"
end
# 最後の評価された式の値が返る(この場合"Hello")
!
def testfunc2( num = 100, memo = nil ) # 引数あり、デフォルト引数指定可
if num > 100
return "result" => "high", :memo => memo # 複数の返り値
else
return "result" => "low", :memo => memo
end
end
!
puts testfunc
puts testfunc2(90,"abcd")
puts testfunc2(150)
!
# => “Hello”
# => {“result”=>”low”, :memo => “abcd”}
# => {“result”=>”high”, :memo => nil}
メソッド名は小文字から始まる英数字
引数は省略、仮引数、デフォルト引数の指定可能
(他にも可変個数引数などの記述が可能)
メソッドの帰り値は、メソッド呼び出しから戻る直前の評価式の値、
または return に渡された値。 複数の帰り値を返す記述も可能
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
23
24
2-1_Ruby言語基礎演習.indd 24
15/02/06 9:55
8.2.クラス
オブジェクトに関する定義と手続きをまとめたものを「クラス」と
呼びます。
fig13-1.rb クラス基本
!
!
DEFAULT_BRAND = “tsugaru”�#定数定義
!
class Fruit
#クラス名は大文字から
def initialize(str = “apple")
# initializeは、このクラスのインスタンスが生成された直後に呼び出される
@str_name = str
@str_brand = "unknown"
end
def name
@str_name
end
def brand
@str_brand
end
# クラスメソッド定義(C++で言うところのメンバ関数)
#
!
def set_name(str, brand)
@str_name = str
����@str_brand = brand
end
!
end # Fruitクラス定義ここまで
!
p "brand name : #{Fruit::DEFAULT_BRAND}”��# => "tsugaru"
a = Fruit.new
# aはFruitクラスのインスタンス
p a.brand
# => “unknown”
a.set_name("apple", "fuji")
p a.brand
# => “fuji”
!
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
24
25
2-1_Ruby言語基礎演習.indd 25
15/02/06 9:55
8.3.クラス継承
fig13-3.rb クラス継承
!
class Area
# 面積を扱うクラス
def initialize(x=0, y=0)
@x = x; @y = y
# @つきの変数はクラス変数
end
def calc_gross
@x * @y
end
end
!
class Area_3D < Area
# 面積クラスの要素を継承して体積クラスを定義
def initialize(x=1, y=1, z=1)
super(x,y)
# superは継承元の同じメソッドを呼び出す
@z = z
end
def calc_gross
super * @z
end
end
!
a = Area_3D.new( 10, 20, 30 )
p a.calc_gross
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
25
26
2-1_Ruby言語基礎演習.indd 26
15/02/06 9:55
9. モジュール
モジュールはインスタンスを生成できない、継承もできない、
共通部品のようなものと考えるとよい
fig14-1.rb モジュール
!
module Check_data
def check_range(value)
value >= 20
end
end
!
class Test
include Check_data
end
# クラスの中にモジュール組み込み
class Test2
include Check_data
end
#
!
!
a = Test.new
b = Test2.new
p a.check_range(20)
p b.check_range(19)
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
26
27
2-1_Ruby言語基礎演習.indd 27
15/02/06 9:55
10.演習
10.1.標準ライブラリの利用
Ruby標準のライブラリを用いてWebサーバからページをGet。
fig_net-1.rb HTTPサーバアクセス1
!
!
require 'net/http'
require 'uri'
# 標準ライブラリ/ネットワーク
# URIパーサ
uri = URI.parse('http://www.yahoo.co.jp/')
puts Net::HTTP.get(uri) # YahooトップをGetしてHTMLソース表示
社会人技術者研修 2014年度テキスト
Ruby基礎演習
27
28
2-1_Ruby言語基礎演習.indd 28
15/02/06 9:55
!
10.2.標準ライブラリの利用(2)
Yahooページから東京の天気の情報を確認して返すモジュール
fig_net-1a.rb HTTPサーバアクセス2
module YahooTenki
require 'net/http'
require 'uri'
!
def tokyo
uri = URI.parse('http://weather.yahoo.co.jp/weather/jp/13/4410.html')
data = Net::HTTP.get(uri)
doc = data
tags = doc.scan(/\<.*\>.*\<.*\>/)
tags.each do |tag|
if tag.index('class="pict"')
p tag
break
end
end
#result
end
module_function :tokyo
end
!
YahooTenki::Tokyo
社会人技術者研修 2014年度テキスト
Ruby基礎演習
28
29
2-1_Ruby言語基礎演習.indd 29
15/02/06 9:55
10.3.外部ライブラリの利用
Yahooページから東京の天気の情報を確認して返すモジュール
(nokogiri gemライブラリ利用)
fig_net-1a.rb HTTPサーバアクセス・外部ライブラリ
# encoding: utf-8
module YahooTenki
require 'nokogiri'
require 'open-uri'
require 'kconv'
# Webスクレイピングライブラリ
!
def Tokyo
url = 'http://weather.yahoo.co.jp/weather/jp/13/4410.html'
charset = nil
html = open(url) do |f|
charset = f.charset
f.read
end
doc = Nokogiri::HTML.parse(html, nil, charset)
doc.css("p.pict")[0].text
end
module_function :tokyo
end
!
!
print "今日の東京の天気は #{YahooTenki::tokyo} です。".toutf8, “\n”
�������#(↑#{}記述での文字列内式展開)
コマンドから実行
!
!
>ruby fig_net1b.rb
今日の東京の天気は 晴時々曇 です。
社会人技術者研修 2014年度テキスト
Ruby基礎演習
29
30
2-1_Ruby言語基礎演習.indd 30
15/02/06 9:55
11.次のステップへ
11.1.Rubyプログラミングでの主な他要素
オブジェクト指向プログラミング
→ 組んですぐ動かして確認ができる特徴を活用
!
正規表現
→ とかく避けては通れない要素、試しながら習熟
!
例外処理・エラー処理など
→ 実践的・実用目的なプログラミングで必修
!
各種ライブラリの活用
→ 膨大なライブラリの活用、実用コードの習熟
!
Ruby on Railsへ
→ Webシステム開発の切り札
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
30
31
2-1_Ruby言語基礎演習.indd 31
15/02/06 9:55
12.演習プログラム
2.1 最初のプログラム
list2-1 hello.rb
!
!
puts(“Hello”)
2.2 コメント
list2-2 hello2.rb
!
#はじめてのrubyプログラム
puts(“Hello”)
!
=begin
puts(“Bye!")
=end
# =begin =end 間はコメントアウト
!
2.3 セミコロン
list2-3 hello3.rb
!
#はじめてのrubyプログラム
puts "Hello! Ruby”; puts ”Bye!”
社会人技術者研修 2014年度テキスト
Ruby基礎演習
32
32
2-1_Ruby言語基礎演習.indd 32
15/02/06 9:55
3.1 文字列
list3-1 string.rb
!
# 文字列
str = "Hello"
str = ‘Hello'
!
# ※ダブルコーテーションをシングルコーテーションで囲むと
# ダブルコーテーションも文字列に含まれます その逆も可
str = ‘“test”’
# 特殊文字
puts "Hello! ¥nBye!”
puts “tab¥ttab”
3.2 数値
list3-2 numeric.rb
!
# 変数num1に整数123を代入、num2に小数10.8を代入
num1 = 123
# 整数
num2 = 10.8
# 小数
!
# その他の数値表現
hex = 0x1fff
# 16進
binary = 0b1011 # 2進
fixnum = 4e20
#�指数
社会人技術者研修 2014年度テキスト
Ruby基礎演習
33
33
2-1_Ruby言語基礎演習.indd 33
15/02/06 9:55
!
3.3 変数
3.4 定数
3.5 nil値
list3-3 fig2.rb
!
#変数
foo = 1
foo = "FOO"
_value = 100
$bar = 999
@value = 123
@@test = 0
Foo = ‘FOO'
p true
p false
p nil
!
# 数値代入
# 文字列代入
# グローバル変数
# インスタンス変数
# クラス変数
# 定数
#真
#偽
# nil値
4.1 演算子
list4-1 operator.rb
!
p �2 * 3
p �9 / 3
p �7 + 3
p �7 - 3
p �7 & 3
p 2 ** 2
!
# 乗算
# 序算
# 加算
# 減算
# 剰余
#�べき乗
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
34
34
2-1_Ruby言語基礎演習.indd 34
15/02/06 9:55
4.2 代入演算子
4.3 その他の演算子
list4-2 fig3.rb
!
!
!
# 代入演算子
d = 100
d+=1
#=>101
d-=1
#=>100
d*=2
#=>200
d**=2
#=>4000
pd
p 3 && 1
#=>2 論理演算子
p 3 || 1
#=>3 論理演算子
p not true #=>false 論理演算子 p not 0
# => false ※ 0はtrue扱い(nilではない)ことに注意
p not 1
# => false
p not nil
# => true
社会人技術者研修 2014年度テキスト
Ruby基礎演習
35
35
2-1_Ruby言語基礎演習.indd 35
15/02/06 9:55
5.1 条件分岐
5.2 if修飾式
5.3 unless式
5.3 条件演算子
list5-1 fig3.rb
!
# 今が午後か午前かを表示
hour = Time.now.hour # 時刻を得る
if hour >= 12
p "今は午後です"
else
p "今は午前です"
end
!
list5-2 fig4.rb
!
# 年齢チェック
age = 20
puts (age < 20) ? "ng" : "ok"
puts "ng" if age < 20
puts "ok" unless age < 20
# 三項演算子 (条件演算子)
# if修飾子
# unless修飾子
5.5 case式
list5-3 fig5.rb
!
# case式
num = 150
case num
when 1
p "a"
when 2,3,4
p "b"
when 100..200
p "c"
else
p "???"
end
社会人技術者研修 2014年度テキスト
Ruby基礎演習
36
36
2-1_Ruby言語基礎演習.indd 36
15/02/06 9:55
6 繰り返し処理
list6-1 fig6.rb
!
# 繰り返し処理
p "while:"
num = 0
while num < 3 do
puts num
num += 1
end
!
p "for:"
for n in 1..3 do
puts n
end
!
p "range:"
(5..8).each { |n|
puts n
}
!
p "times:"
10.times do |n|
puts n
end
!
p "upto:"
3.upto(8) do |n|
puts n
end
!
p "downto:"
3.downto(-2) do |n|
puts n
end
!
p "step:"
3.step(8,2) do |n|
puts n
end
社会人技術者研修 2014年度テキスト
Ruby基礎演習
37
37
2-1_Ruby言語基礎演習.indd 37
15/02/06 9:55
6.6 ループ脱出
list6-6 fig7.rb
!
(1..10).each {|n|
break if n > 4
pn
count = n
}
p "break."
# breakでループを抜ける(if修飾子との組み合わせ)
# 1,2,3だけ表示される
!
p "next:"
(1..10).each do |n|
next if n < 4
# ループの最初に戻る
pn
# 1,2,3は表示されない
end
!
7.1 配列
list7-1 fig8.rb
!
a = [1, 2, 3, 9 , -1]
puts a[0] # => 1
puts a[3] # => 9
puts "max = #{a.max}"
p "------------"
b = [ "apple", "banana", "orange" ]
puts b[2] # => orange
puts b[4].nil? #
puts "length = #{b.length}"
p "------------"
c = [ "abcd", 3, "aaaa", 4.56 ]
c[2] = 10
c[3] = [ 1, 2, 3]
c[1] = 1..5
c.each do |obj|
p obj
end
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
38
38
2-1_Ruby言語基礎演習.indd 38
15/02/06 9:55
7.2 ハッシュ
list7-2 fig9.rb
!
a = {"taro" => 18, "ken" => 20}
p a["taro"]
p a["hoge"]
a["hanako"] = "unknown"
a.each do |key, value|
p "name: #{key} age: #{value}" if value.to_i > 19
end
pa
p a.to_a
8. 1メソッド
list8-1 fig10-1.rb
!
def testfunc
puts "Hello"
end
!
def testfunc2( num = 100, memo = nil )
# "ng"
# "ok"
if num > 100
return "result" => "high", :memo => memo
else
return "result" => "low", :memo => memo
end
end
!
testfunc
puts testfunc2(90,"abcd")
puts testfunc2(150)
puts testfunc2(200, "xxxx")
社会人技術者研修 2014年度テキスト
Ruby基礎演習
39
39
2-1_Ruby言語基礎演習.indd 39
15/02/06 9:55
list8-2 fig12.rb
!
# ハッシュ経由で不定数データを渡す例
def check_param1( params = {} )
name = param[:name]
age = param[:age]
p name, age
p "age ?? #{name}" if age.to_i < 20
end
!
def check_param2( params = {} )
p params[:school]
end
!
!
!
data = {:name => "taro", :age => 15, :school => "aaaa"}
check_param1(data)
check_param2(data)
社会人技術者研修 2014年度テキスト
Ruby基礎演習
40
40
2-1_Ruby言語基礎演習.indd 40
15/02/06 9:55
!
list8-3 fig11-1.rb
!
# 現在時刻を表示
def get_datetime
str = Time.now
str = d.strftime("%Y年 %m月 %d日")
end
p get_datetime
!
!
list8-4 fig11-2.rb
!
# (参考)時刻計算を強力にサポートするライブラリ
require 'rubygems'
require 'active_support'
t = Time.now # Mon Sep 07 00:24:07 +0900 2009
t - 5.days # 5日前 (Wed Sep 02 00:24:07 +0900 2009)
t - 1.week # 1週間前 (Mon Aug 31 00:24:07 +0900 2009)
t - 2.years # 2年前 (Fri Sep 07 00:24:07 +0900 2007)
# xxx前には ago を使う
1.hour.ago # 1日前 (Sun Sep 06 23:24:07 +0900 2009)
# xxx後には since を使う
2.days.since # 2日後 (Wed Sep 09 00:26:07 +0900 2009)
t.yesterday # Mon Sep 06 00:24:07 +0900 2009
t.tomorrow # Mon Sep 08 00:24:07 +0900 2009
t.beginning_of_month # 月初め (Tue Sep 01 00:00:00 0900 2009)
t.last_month
# 1ヶ月前 (Fri Aug 07 00:24:07 0900 2009)
!
2.minutes.ago.class # Time クラスが返る
社会人技術者研修 2014年度テキスト
Ruby基礎演習
41
41
2-1_Ruby言語基礎演習.indd 41
15/02/06 9:55
!
list8-4 fig11-3.rb
!
# (参考)正規表現の使用
def time_sub
/(\d+)-*(\d+)-(\d+) (\d+):(\d+):(\d+)/ =~ Time.now.to_s
"#{$1}/#{$2}/#{$3} #{$4}:#{$5}:#{$6}"
end
puts time_sub
社会人技術者研修 2014年度テキスト
Ruby基礎演習
42
42
2-1_Ruby言語基礎演習.indd 42
15/02/06 9:55
8.2 クラス
list8-5 fig13-1.rb
!
# 果物クラス
class Fruit
DEFAULT_BRAND = "tsugaru"
def initialize(str = "apple")
@str_name = str
# $B%$%s%9%?%s%9JQ?t(B
@str_brand = "unknown" #
end
def name
@str_name
end
def brand
@str_brand
end
!
def set_name(str, brand)
@str_name = str
@str_brand = brand
end
end
!
p "brand name : #{Fruit::DEFAULT_BRAND}"
a = Fruit.new
p a.brand
a.set_name("apple", "fuji")
p a.brand
!
class Fruit # 多重定義
def xxx
end
end
社会人技術者研修 2014年度テキスト
Ruby基礎演習
43
43
2-1_Ruby言語基礎演習.indd 43
15/02/06 9:55
!
list8-6 fig13-2.rb
!
# 面積クラス
class Area
def initialize(x=0, y=0)
@x = x
@y = y
end
def calc_gross
@x * @y
end
end
a = Area.new( 10, 20 )
p a.calc_gross
b = Area.new( )
p b.calc_gross
!
!
list8-7 fig13-3.rb
!
# アクセスメソッド
class Car
def initialize(car_name="unknown")
@name = car_name
end
attr_accessor :name
# 読み書き
# attr_reader :name
# 読み込みのみ
# attr_writer :name
# 書き込みのみ
end
!
car = Car.new()
p car.name
car.name = "PRIUS"
p car.name
!
p car.methods
社会人技術者研修 2014年度テキスト
# 登録されているメソッド一覧
Ruby基礎演習
44
44
2-1_Ruby言語基礎演習.indd 44
15/02/06 9:55
!
8.3 クラス継承
list8-8 fig13-4.rb
!
# 面積クラス
class Area
def initialize(x=0, y=0)
@x = x; @y = y
end
def calc_gross
@x * @y
end
end
!
# 面積クラスを継承した体積クラス
class Area_3D < Area
def initialize(x=1, y=1, z=1)
super(x,y) ; @z = z
end
def calc_gross
super * @z
end
end
a = Area_3D.new( 10, 20, 30 )
p a.calc_gross
!
!
社会人技術者研修 2014年度テキスト
Ruby基礎演習
45
45
2-1_Ruby言語基礎演習.indd 45
15/02/06 9:55
list8-9 fig13-5.rb
!
面積クラスを拡張し体積クラス、比重パラメータを追加、重量計算
!
# 面積クラス
class Area
def initialize(x=0, y=0)
@x = x; @y = y
end
def calc_gross
@x * @y
end
def gravity
1
end
!
protected
def fix_param
1.1
end
end
# 比重要素を追加
!
# 体積クラス(比重・重量計算つき)
class Area_3D < Area
def initialize(x=1, y=1, z=1)
super(x,y)
@z = z
end
def calc_gross
super * @z # 継承元メソッドの呼び出し
end
def calc_weight
calc_gross * gravity * fix_param
end
private
def gravity
7
end
end
# メソッドのオーバライド
!
a = Area_3D.new( 10, 20, 30 )
p a.calc_weight
# 重量
社会人技術者研修 2014年度テキスト
Ruby基礎演習
46
46
2-1_Ruby言語基礎演習.indd 46
15/02/06 9:55
list8-9 fig13-5.rb
!
グローバル変数、クラス変数、インスタンス変数の違いを確認
!
$GLOBAL_DATA = "aaaaa"
!
class Sample
def set_data(data)
@@data = data
end
def get_data
@@data
end
def self.set_common_data(data)
@data = data
end
def self.get_common_data
@data
end
end
!
a = Sample.new
a.set_data(123)
#p Sample::set_common_data(999)
p a.get_data
!
b = Sample.new
#p Sample::get_common_data
p b.get_data
社会人技術者研修 2014年度テキスト
Ruby基礎演習
47
47
2-1_Ruby言語基礎演習.indd 47
15/02/06 9:55
!
9 モジュール
list9-1 fig14-1.rb
!
module Check_data
def check_range(value)
value >= 20
end
end
!
class Test
include Check_data
end
# クラスの中にモジュール組み込み
class Test2
include Check_data
end
#
!
!
a = Test.new
b = Test2.new
p a.check_range(20)
p b.check_range(19)
社会人技術者研修 2014年度テキスト
Ruby基礎演習
48
48
2-1_Ruby言語基礎演習.indd 48
15/02/06 9:55
10. 演習
list10-1 fig_net1.rb
!
!
# Yahoo JapanサイトのHTTPデータを読み込む
require 'net/http'
require 'uri'
uri = URI.parse('http://www.yahoo.co.jp/')
puts Net::HTTP.get(uri)
!
!
!
list10-1 fig_net1.rb
!
# Yahoo Japanサイトの気象情報ページから東京都の天気を抽出する
!
module YahooTenki
require 'net/http'
require 'uri'
!
def tokyo
uri = URI.parse('http://weather.yahoo.co.jp/weather/jp/13/4410.html')
data = Net::HTTP.get(uri)
doc = data
#doc = data.encode(Encoding::SJIS,:invalid => :replace, :undef => :replace)
tags = doc.scan(/\<.*\>.*\<.*\>/)
tags.each do |tag|
if tag.index('class="pict"')
p tag
break
end
end
#result
end
module_function :tokyo
end
!
YahooTenki::tokyo #モジュール::メソッドの呼び出し
社会人技術者研修 2014年度テキスト
Ruby基礎演習
49
49
2-1_Ruby言語基礎演習.indd 49
15/02/06 9:55
list10-1 fig_net1.rb
!
# Yahoo Japanサイトの気象情報ページから東京都の天気を抽出する
# Nokogiri ライブラリを利用
!
# encoding: utf-8
module YahooTenki
require 'nokogiri'
require 'open-uri'
require 'kconv'
!
def tokyo
url = 'http://weather.yahoo.co.jp/weather/jp/13/4410.html'
charset = nil
html = open(url) do |f|
charset = f.charset
f.read
end
doc = Nokogiri::HTML.parse(html, nil, charset)
doc.css("p.pict")[0].text
end
module_func
end
!
print "今日の東京の天気は #{YahooTenki::tokyo} です。".toutf8, “\n”
社会人技術者研修 2014年度テキスト
Ruby基礎演習
50
50
2-1_Ruby言語基礎演習.indd 50
15/02/06 9:55
2-1_Ruby言語基礎演習.indd 51
15/02/06 9:55
平成 年度文部科学省 「成長分野等における中核的専門人材養成等の戦略的推進事業」
クラウド・スマートデバイス時代に対応したITビジネスクリエータの地域版社会人・女性学び直し教育プログラム開発と実践
■実施委員会
◎吉田 松雄
学校法人吉田学園 理事長
黒木 亮谷
学校法人黒木学園 理事長
武田 結幸
学校法人武田学園 理事長
山本 匡
学校法人小山学園 理事長
栗原 寛隆 学校法人栗原学園 理事長
高橋秀也
大阪市立大学 教授
山本哲男
株式会社八雲ソフトウェア 代表取締役
渡部 薫
株式会社ジー・クラウド 代表取締役社長
岡山 保美
株式会社KEIアドバンス 取締役会長
飯塚 正成
一般社団法人全国専門学校情報教育協会 専務理事
■社会人研修分科会
◎岡山 保美
株式会社KEIアドバンス 取締役会長
村岡 好久
名古屋工学院専門学校 統括アドバイザー
谷口 英司
日本電子専門学校情報ビジネスライセンス科科長
吉田 進一
吉田通信企画 代表
山本哲男
株式会社八雲ソフトウェア 代表取締役
冨田 慎一
(VWRP\ 6\VWHPV 代表
吉岡 正勝
株式会社日本教育ネットワークコンソシアム 事業開発部マネージャー
■女性学び直し分科会
◎岡山 保美
株式会社KEIアドバンス 取締役会長
菅野 崇行
吉田学園情報ビジネス専門学校 情報システム学科スマートフォン・クラウド学科
谷口 英司
日本電子専門学校情報ビジネスライセンス科科長
大礒 洋明
コーデトーイズ株式会社 代表取締役
大園 博美
有限会社Aries 代表
戸田 雅人
レインボーアップス株式会社
我妻 幸長
レインボーアップス株式会社
吉岡 正勝
株式会社日本教育ネットワークコンソシアム 事業開発部マネージャー
■教員育成分科会
◎岡山 保美
株式会社KEIアドバンス 取締役会長
菅野 崇行
吉田学園情報ビジネス専門学校 情報システム学科スマートフォン・クラウド学科
村岡 好久
名古屋工学院専門学校 統括アドバイザー
谷口 英司
日本電子専門学校情報ビジネスライセンス科科長
坂田 拡光
株式会社KEIアドバンス教育事業戦略推進部部長
野吾 教行
学校法人河合塾 教育研究開発本部 教育研究部
吉岡 正勝
株式会社日本教育ネットワークコンソシアム 事業開発部マネージャー
平成 年度文部科学省委託「成長分野等における中核的専門人材養成等の戦略的推進事業」
クラウド・スマートデバイス時代に対応した
ITビジネスクリエータの地域版社会人・女性学び直し教育プログラム開発と実践
Ruby 言語 基礎演習
社会人技術者研修テキスト
平成 年 月
学校法人吉田学園(吉田学園情報ビジネス専門学校)
〒 北海道札幌市中央区南 条西 丁目
7(/ )$; ●本書の内容を無断で転記、掲載することは禁じます。
2-1_Ruby言語基礎演習.indd 52
15/02/06 9:55