-
!!
Ruby言語 基礎演習 社会人技術者研修 2014年度 テキスト
!!
2014.11 !
1Ruby基礎演習社会人技術者研修 2014年度テキスト
-
目的 ますます注目されている国産プログラミング言語Rubyについて、
基本的な言語の概要と、一般的に利用される要素について解説、
本テキストはその解説補助とするものです
!達成目標
Ruby言語の基礎的な部分の理解
インタプリタ型言語の特色を活かし対話的にプログラミング実習
既にあるコードを読んでいけるまでの理解
その後、各自がさらに習熟をすすめていけるところまでを目標
!!
改訂・更新 2014.11 作成
2015.2.1 改訂
2Ruby基礎演習社会人技術者研修 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 の他、多種のプラッットフォームやライブラリ
・日本発祥の開発言語(まつもとゆきひろ氏)
3Ruby基礎演習社会人技術者研修 2014年度テキスト
https://www.ruby-lang.org/ja/about/
-
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
などが使われています。
4Ruby基礎演習社会人技術者研修 2014年度テキスト
-
!
1.5. コマンドプロンプトの操作
本演習では各OSのコマンドライン(DOSプロンプト等)を利用します。各OSのコマンド操作の基礎的な操作を必要とします
・Windows → コマンド ・MacOS → ターミナル
!!
5Ruby基礎演習社会人技術者研修 2014年度テキスト
-
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 記述の方法もあります)
6Ruby基礎演習社会人技術者研修 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> !
終了するには exit か quit を入力
7Ruby基礎演習社会人技術者研修 2014年度テキスト
-
3. 変数と定数
3.1.文字列
文字列はダブルコーテーション、またはシングルコーテーションで囲み、次のように代入します
str = "Hello" str = ‘Hello' ※ダブルコーテーションをシングルコーテーションで囲むと ダブルコーテーションも文字列に含まれます�その逆も可
特殊文字(他にもありますが略)
¥t タブ ¥n 改行 ¥r リターン ¥f 改ページ ¥s 空白
以下のように記述します
puts "Hello!¥nBye!” > ruby hello.rb Hello! Bye! !
8Ruby基礎演習社会人技術者研修 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
!
9Ruby基礎演習社会人技術者研修 2014年度テキスト
-
3.4.定数
アルファベット大文字で始まる識別子が定数
FOO = 'FOO'
※true,falseについては予約語(疑似変数)として予約済み
true (真) false (偽)
3.5.nil値
nil は「値のない状態」を示す
foo = nil
他言語におけるNULL等に相当
!
10Ruby基礎演習社会人技術者研修 2014年度テキスト
-
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にはありません
!
11Ruby基礎演習社会人技術者研修 2014年度テキスト
http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2foperator.html
-
4.3.その他の演算子
演算子の記述
= 代入演算子(これも演算として考える) && and 論理演算子 || or 論理演算子 ! not 論理演算子 .. 範囲演算子 ... 範囲演算子 :: スコープ演算子 ?: 条件演算子
12Ruby基礎演習社会人技術者研修 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 "今は午前です" end
13Ruby基礎演習社会人技術者研修 2014年度テキスト
-
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を使うかは好みの問題)
14Ruby基礎演習社会人技術者研修 2014年度テキスト
-
5.4.条件演算子
C言語での三項演算子と同類
記述
評価式 ? 式 : 式 !動作例
age = 20 puts (age < 20) ? "ng" : “ok"��# => “ok” !a = true ? "ok" : "ng" puts a # => "ok"
!if修飾式と同様に凝縮した記述ができる
15Ruby基礎演習社会人技術者研修 2014年度テキスト
-
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 !
16Ruby基礎演習社会人技術者研修 2014年度テキスト
http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fcontrol.html
-
6. 繰り返し処理
6.1.while式
記述
while 評価式 do end !
動作例
n = 1 while n
-
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
18Ruby基礎演習社会人技術者研修 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はと{~}の記述は同義
!
19Ruby基礎演習社会人技術者研修 2014年度テキスト
-
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
!!
20Ruby基礎演習社会人技術者研修 2014年度テキスト
-
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 が表示される
!
21Ruby基礎演習社会人技術者研修 2014年度テキスト
-
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”]]
!
22Ruby基礎演習社会人技術者研修 2014年度テキスト
-
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 に渡された値。 複数の帰り値を返す記述も可能
!
23Ruby基礎演習社会人技術者研修 2014年度テキスト
-
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” !!
24Ruby基礎演習社会人技術者研修 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 !
25Ruby基礎演習社会人技術者研修 2014年度テキスト
-
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) !
26Ruby基礎演習社会人技術者研修 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ソース表示
!
27Ruby基礎演習社会人技術者研修 2014年度テキスト
-
!
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
28Ruby基礎演習社会人技術者研修 2014年度テキスト
-
10.3.外部ライブラリの利用
Yahooページから東京の天気の情報を確認して返すモジュール (nokogiri gemライブラリ利用)
fig_net-1a.rb HTTPサーバアクセス・外部ライブラリ # encoding: utf-8 module YahooTenki require '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 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 今日の東京の天気は 晴時々曇 です。
!!
29Ruby基礎演習社会人技術者研修 2014年度テキスト
-
11.次のステップへ
11.1.Rubyプログラミングでの主な他要素
オブジェクト指向プログラミング
→ 組んですぐ動かして確認ができる特徴を活用
!正規表現
→ とかく避けては通れない要素、試しながら習熟
!例外処理・エラー処理など
→ 実践的・実用目的なプログラミングで必修
!各種ライブラリの活用
→ 膨大なライブラリの活用、実用コードの習熟
!
30Ruby基礎演習社会人技術者研修 2014年度テキスト