!
!
Ruby言語 基礎演習
社会人技術者研修
2014年度 テキスト
!
!
2014.11
!
目的
ますます注目されている国産プログラミング言語Rubyについて、
基本的な言語の概要と、一般的に利用される要素について解説、
本テキストはその解説補助とするものです
!
達成目標
Ruby言語の基礎的な部分の理解
インタプリタ型言語の特色を活かし対話的にプログラミング実習
既にあるコードを読んでいけるまでの理解
その後、各自がさらに習熟をすすめていけるところまでを目標
!
!
改訂・更新
2014.11 作成 2015.2.1 改訂 2 Ruby基礎演習 社会人技術者研修 2014年度テキスト1. Rubyについて
1.1. Rubyの基礎知識
Rubyは、手軽にオブジェクト指向プログラミングができるスクリ
プト言語です。
近年ではWebアプリケーション開発用として登場したフレームワー
ク「Ruby on Rails」の普及により、メジャーな開発言語の1つと
なっています。
→ Rubyとは https://www.ruby-lang.org/ja/about/
!
1.2. 主な特徴
・インタプリタ言語
・簡潔で綺麗な記述の文法
・オブジェクト指向言語
・オープンソース、無料
・マルチプラットフォーム
・Ruby on Rails の他、多種のプラッットフォームやライブラリ
・日本発祥の開発言語(まつもとゆきひろ氏)
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
などが使われています。
4 Ruby基礎演習 社会人技術者研修 2014年度テキスト
!
1.5. コマンドプロンプトの操作
本演習では各OSのコマンドライン(DOSプロンプト等)を利用
します。各OSのコマンド操作の基礎的な操作を必要とします
・Windows → コマンド
・MacOS → ターミナル
!
!
2. さっそく動かしてみる
2.1.
最初のプログラム
テキストエディタを使って下のコードを入力し、
「hello.rb」という名前で保存してください。
hello.rb
puts "Hello! Ruby”
!
ファイル保存後、コマンドラインから以下のようにで実行します
>ruby hello.rb (リターン)すると以下のように画面出力されます。
このプログラムでは、ただ文字を画面に出力するだけの動作です。
> ruby hello.rb Hello! Ruby2.2.コメント記述
プログラムの記述意外に、メモや注釈を入れてみます。
# はじめてのrubyプログラム puts "Hello! Ruby"Ruby言語におけるコメント記述は 半角 # から続く行の終わりまで
が対象となります。実行してみましょう。
> ruby hello.rb Hello! Ruby!
コメント行は何も実行しないので、同じ結果となります。
(他に =begin ∼ =end 記述の方法もあります)
6 Ruby基礎演習 社会人技術者研修 2014年度テキスト
!
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>
!
3. 変数と定数
3.1.文字列
文字列はダブルコーテーション、またはシングルコーテーションで
囲み、次のように代入します
str = "Hello" str = ‘Hello' ※ダブルコーテーションをシングルコーテーションで囲むと ダブルコーテーションも文字列に含まれます�その逆も可特殊文字(他にもありますが略)
¥t タブ ¥n 改行 ¥r リターン ¥f 改ページ ¥s 空白以下のように記述します
puts "Hello!¥nBye!” > ruby hello.rb Hello! Bye!!
8 Ruby基礎演習 社会人技術者研修 2014年度テキスト3.2.数値
整数値の記述だと整数、小数点以下が含まれると小数拡張して扱わ
れることに注意。
fig2.rb # 変数num1に整数123を代入、num2に小数10.8を代入 num1 = 123 # 整数 num2 = 10.8 # 小数(その他)
0x1fff # 16進 0b1011 # 2進 4e20 #�指数3.3.変数
変数は小文字または`_'で始まる識別子で記述、
Rubyには型宣言が無い(全てがオブジェクト)
ローカル変数
foo = 1 # 数値代入 foo = "FOO" # 文字列代入 _value = 100グローバル変数は戦闘が$
$bar = 999インスタンス変数、クラス変数(後述)
@value = 123 # インスタンス変数 @@test = 0 # クラス変数!
※Rubyの変数はその値を指すメモリ領域ということに注意
(参考: 値渡しと参照渡しの違いを理解する�ー Rubyist Magazine) →�http://magazine.rubyist.net/?0032-CallByValueAndCallByReference!
3.4.定数
アルファベット大文字で始まる識別子が定数
FOO = 'FOO'※true,falseについては予約語(疑似変数)として予約済み
true (真) false (偽)3.5.nil値
nil は「値のない状態」を示す
foo = nil他言語におけるNULL等に相当
!
10 Ruby基礎演習 社会人技術者研修 2014年度テキスト4. 演算子
4.1.四則演算など
演算子の記述
* 乗算 / 除算 + 加算 - 減算 % 剰余 ** べき乗 d = 100 + 23 # ans. 123!
演算子の優先順位
参考 http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2foperator.html4.2.代入演算子
動作例
d = 100 d += 1 # => 101 d -= 1 # => 100 d *= 2 # => 200 d **= 2 # => 4000!
※インクリメント、デクリメント演算子はRubyにはありません
!
4.3.その他の演算子
演算子の記述
= 代入演算子(これも演算として考える) && and 論理演算子 || or 論理演算子 ! not 論理演算子 .. 範囲演算子 ... 範囲演算子 :: スコープ演算子 ?: 条件演算子 12 Ruby基礎演習 社会人技術者研修 2014年度テキスト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 "今は午前です" end5.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を使うかは好みの問題)
14 Ruby基礎演習
5.4.条件演算子
C言語での三項演算子と同類
記述
評価式 ? 式 : 式!
動作例
age = 20puts (age < 20) ? "ng" : “ok"��# => “ok”
!
a = true ? "ok" : "ng" puts a # => "ok"
!
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!
16 Ruby基礎演習 社会人技術者研修 2014年度テキスト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!
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 18 Ruby基礎演習 社会人技術者研修 2014年度テキスト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はと{∼}の記述は同義
!
6.6.ループ脱出等
break ー 脱出
next ー ループの最初に戻る
!
fig7.rb ループ脱出記述例!
lev = 4 count = 0 (1..10).each {|n| break if n > 4 # if修飾との組み合わせ p n count = n } p "break."!
p "next:" (1..10).each do |n| next if n < 4 p n # 1,2,3は表示されない end!
!
20 Ruby基礎演習 社会人技術者研修 2014年度テキスト7. 配列とハッシュ
7.1.配列
fig8.rb 配列操作例!
配列と要素参照
a = [1, 2, 3, 9 , -1] # 一次元配列の格納 puts a[0] # => 1 # 要素の参照 puts a[3] # => 9puts "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 が表示される!
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
!
ハッシュを配列に変換
p a # =>{"taro" => 18, "ken" => 20, ”hanako”=> "unknown"} p a.to_a # =>[[“taro” => 18], [“ken" => 20], [hanako”=> “unknown”]]
!
22 Ruby基礎演習
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 # => “Hello”
puts testfunc2(90,"abcd") # => {“result”=>”low”, :memo => “abcd”} puts testfunc2(150) # => {“result”=>”high”, :memo => nil}
!
メソッド名は小文字から始まる英数字
引数は省略、仮引数、デフォルト引数の指定可能
(他にも可変個数引数などの記述が可能)
メソッドの帰り値は、メソッド呼び出しから戻る直前の評価式の値、
または return に渡された値。 複数の帰り値を返す記述も可能
!
8.2.クラス
オブジェクトに関する定義と手続きをまとめたものを「クラス」と
呼びます。
fig13-1.rb クラス基本!
class Fruit #クラス名は大文字から!
DEFAULT_BRAND = “tsugaru”�#定数定義!
def initialize(str = “apple")
# initializeは、このクラスのインスタンスが生成された直後に呼び出される @str_name = str @str_brand = "unknown" end def name # クラスメソッド定義(C++で言うところのメンバ関数) @str_name end def brand # @str_brand end
!
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”
!
!
24 Ruby基礎演習 社会人技術者研修 2014年度テキスト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!
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)!
26 Ruby基礎演習 社会人技術者研修 2014年度テキスト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ソース表示
!
!
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 28 Ruby基礎演習 社会人技術者研修 2014年度テキスト10.3.外部ライブラリの利用
Yahooページから東京の天気の情報を確認して返すモジュール
(nokogiri gemライブラリ利用)
fig_net-1a.rb HTTPサーバアクセス・外部ライブラリ # encoding: utf-8 module YahooTenkirequire 'nokogiri' # Webスクレイピングライブラリ
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 enddoc = Nokogiri::HTML.parse(html, nil, charset) doc.css("p.pict")[0].text
end
module_function :tokyo end
!
print "今日の東京の天気は #{YahooTenki::tokyo} です。".toutf8, “\n” �������#(↑#{}記述での文字列内式展開)