学習の準備をしよう

  • 洗練されたオブジェクト指向型言語
  • Ruby On Rails / Sinatra => フレームワーク
  • 公式サイト
  • 環境(MacOS Xには標準でプリインストール)
  • Rubyのバージョンを確認
$ ruby -v
  • ローカル開発環境に「ruby_lessons」ディレクトリを作成

はじめてのRuby

  • 「hello.rb」を作成
print "Hello World"
  • 実行方法
$ ruby hello.rb
  • 文の終りは「改行」か「;」
  • 1行コメントは「#」
  • ブロックコメントは「=begin」「=end」で挟む

オブジェクトを表示するメソッド

print "Hello World", "world" # 普通に表示
puts "Hello World, again" # 改行付で表示
p "Hello World 3" # オブジェクト型がわかるように表示

変数と定数について

  • 変数:オブジェクトにつける名札
  • 英子文字か_で始まる
  • 予約語はなし(例:end)
x = 10
p x
  • 定数:全部大文字、変更禁止
MY_EMAIL = ""

オブジェクトとメソッドを理解しよう

  • オブジェクト指向型言語で使われる用語
  • オブジェクト:便利な命令が詰まったデータ型
  • メソッド:便利な命令
p "hello".length

クラスとインスタンスを理解しよう

  • クラス:設計図
  • インスタンス:実体化されたデータ

数値的オブジェクトの演算

  • 分数
x = Rational(2, 3)
puts x
  • 演算子:+ - * / % **
x = 5 ** 2 # 25
x = 5 % 2 # 1
x = Rational(2, 3) + Rational(5, 6) # 3/2
  • RationalメソッドはMacプリインストールRuby環境で使用不可。requireが必要?(MacOS 10.6.8 / ruby 1.8.7)
  • ruby 1.9.2では改善

数値的なオブジェクトで使えるメソッド

  • 型変換
p 10.5.to_i # 10
p 10.5.to_r # 2/3
  • 四捨五入
p 10.8.round # 11
p 10.8.ceil # 11
p 10.8.floor # 10
  • 乱数
p rand(100)
  • 平方根
p Math.sqrt(2) # 1.4142135623731

文字列オブジェクトを理解する

x = "hello" # 変数や特殊文字を展開 
y = 'hello' # 展開しない
# 特殊文字:\n \t
  • 変数の展開
name = "taguchi"
puts "my name is #{name}"

文字列オブジェクトのメソッド

p "hello".length # 文字列の長さを表示
p "hello".upcase # 文字列を大文字で表示
p "hello".reverse # 文字列を逆順で表示
p "hello".index("o") # 任意の文字が何文字目にあるか表示
p "hello".include?("o") # 任意の文字が含まれるかどうか表示
  • その他のメソッドは公式リファレンスのStringクラスを参照

破壊的メソッドとは?

s = "hello"
s1 = s.upcase! # 「!」を付与すると「s」も「s1」で上書き
p s
p s1

配列オブジェクトを理解する

names = ["tabuchi", "fkoji", "dotinstall"]
p names
p names[0] # 0番目の要素
p names[1..2] # 範囲指定:1番目〜2番目
p names[0...2] # 範囲指定:0番目〜2番目、但し2番目は含まない
p names[-1] # 後ろから1番目

配列オブジェクトを操作する

names[0] = "taguchi_new" # 0番目要素に代入
names[0..1] = ["taguchi_new", "fkoji_new"] # 0〜1番目要素に代入
names[1, 2] = ["a", "b"] # 1番目から2個の要素に代入
names[1, 2] = ["c", "d"] # 1番目から挿入

配列オブジェクトの演算

a = [1, 2, 3, 4]
b = [3, 4, 5, 6]
p a & b # 積集合を表示
p a | b # 和集合を表示
p a - b # aからbを引いた要素を表示
p a + b # aとbを足した要素を表示(重複あり)

配列オブジェクトのメソッド

a = [1, 5, 3, 4, 5, 4, 8]
p a.uniq # 重複値を取り除いて表示
p a.sort # 昇順にソートして表示
  • 先頭と末尾の操作
    • unshift / push:追加
    • shift / pop 削除
p a.push(10) # 末尾に10を追加

ハッシュオブジェクトを理解する

  • ハッシュオブジェクト(連想配列)
sales = {"tanaka"=>100, "taguchi"=>150, "taniguchi"=>300}
p sales["tanaka"]

ハッシュオブジェクトのメソッド

sales = {"tanaka"=>100, "taguchi"=>150, "taniguchi"=>300}
p sales.size # サイズを表示
p sales.empty? # 空であるか?
p sales.key?("tanaka") # キーがあるかどうか?
p sales.has_value?(222) # バリューがあるかどうか?

日付や時間に関するクラスとメソッド

  • 現在時刻
t = Time.now
p t
p t.year # 年のみ表示
p t.month # 月のみ表示
  • 時刻を生成
t = Time.mktime(2011, 2, 24, 9, 0, 0)
p t + 10 # 10秒足して表示
p t.strftime("%Y/%m/%d") # フォーマット指定された表記で表示
$ ruby hello.rb
2011-02-24 09:00:10 +0900
"2011/02/24"

printfメソッドを使おう

x = "taguchi"
y = 25
printf("%s's score is %d\n", x, y)
# %s:文字列 %d:10進数の数値
$ ruby hello.rb
taguchi's score is 25
  • 表示オプション
printf("%10s's score is %d\n", x, y) # 文字列を10桁で表示(右揃い)
printf("%s's score is %d\n", x, y) # 文字列を10桁で表示(左揃い)
printf("%s's score is %8d\n", x, y) # 数字を8桁で表示
printf("%s's score is %08d\n", x, y) # 数字を8桁で表示(空白を0で埋める)
  • 文字列を返す「sprintf」
z = sprintf("%s's score is %d\n", x, y)
p z

if文で条件分岐をしよう

score = 85
if score >= 80 then # thenは省略可能
	puts "great!"
elsif score >= 60
	puts "so so..."
else
	puts "not so great"
end

if分の別の書き方を理解しよう

  • 簡略的な書き方
puts "great" if score >= 80
  • 条件演算子 if ... else ...
# 条件式?真の時の値:偽の時の値
a = 50
b = 20
max = a > b ? a : b
p max

比較演算子

  • 不等号/不等号:< > >= <= == !=
  • 正規表現の文字列マッチング: =~
puts "match!" if /taguchi/ =~ "my name is taguchi"
# "my name is taguchi"に"taguchi"が含まれていれば"match!"を表示
  • 論理演算子: && ||

case文による条件分岐を理解しよう

signal = "yellow"
case signal
when "red"
	puts "stop!"
when "green", "blue" # 条件を複数指定可能
	puts "go!"
when "yellow"
	puts "caution!"
else
	puts "signal is broken"
end

timesメソッドによる繰り返し処理

  • 繰り返し処理
5.times do
	puts "hi!"
end
  • 繰り返し番号も表示
5.times do |i|
	puts "#{i} hi!"
end
  • 実行結果
$ ruby hello.rb
hi!
hi!
hi!
hi!
hi!
0 hi!
1 hi!
2 hi!
3 hi!
4 hi!

for/eachによる繰り返し処理

  • for文
users = ["taguchi", "fkoji", "dotinstall"]
for user in users do
	puts user
end
  • each文
users = ["taguchi", "fkoji", "dotinstall"]
users.each do |user|
	puts user
end
  • 実行結果
taguchi
fkoji
dotinstall
  • for文(単純繰り返し)
users = ["taguchi", "fkoji", "dotinstall"]
for i in 1..10 do
	puts i
end
  • 実行結果
1
2
3
4
5
6
7
8
9
10

ハッシュオブジェクトと繰り返し処理

  • each文を使ったハッシュオブジェクトの繰り返し表示処理
 scores = {"taguchi"=>200, "fkoji"=>300, "dotinstall"=>120}
 scores.each do |name, score|
 	printf("%s's score is %d\n", name, score)
 end
  • 実行結果
dotinstall's score is 120
fkoji's score is 300
taguchi's score is 200

while文による繰り返し処理

  • while文(自己代入)
i = 1
while i < 10
	puts i
	# i = i + 1
	i += 1 # 自己代入文
end
  • 実行結果
1
2
3
4
5
6
7
8
9

メソッドを定義しよう

# メソッドの定義
def sing
	puts "lalala~"
end
# メソッドの呼び出し
sing()
  • 実行結果
lalala~
  • 引数付きメソッド
def sing(word) # 引数
	puts word + word + word + "~"
end
sing("hu")
  • 実行結果
huhuhu~
  • 引数の初期値を設定
def sing(word = "la")
	puts word + word + word + "~"
end
sing() # lalala~
sing("hu") # huhuhu~

メソッドの引数、返り値について

def sing(word, num)
	for i in 1..num do
		print word
	end
	puts "~"
end
sing("hu", 10)
  • 実行結果
huhuhuhuhuhuhuhuhuhu~
  • 返り値を設定(実行結果は上記と同様)
def sing(word = "la", num)
	s = ""
	for i in 1..num do
		s += word
	end
	s += "~"
	return s
end
res = sing("hu", 10)
puts res
  • 上記の通りfor文をネストしたメソッドの引数に初期値を設定するとエラー発生(MacOS 10.6.8 / ruby 1.8.7)
  • ruby 1.9.2では改善

クラス作成&インスタンス化

# クラス作成
class Monster # 英大文字で開始

	def initialize(name) # クラス使用時に必ず呼ばれるメソッド
		@name = name # 「@〜」はインスタンス変数(同クラス内はメソッド外で利用可能)
		@hp = 100 + rand(100) # インスタンス変数
		printf("%s appeared.  His hp is %d\n", @name, @hp)
	end

	def damage
		@hp -= 10 + rand(10)
		printf("%s's hp is now %d\n", @name, @hp)
		printf("%s is now dead!\n", @name) if @hp < 0
	end

	def heal
		@hp += 10 + rand(10)
		ptintf("%s's hp is now %d\n", @name, @hp)
	end

end

# インスタンス生成
slime = Monster.new("slime") # Monsterクラスのインスタンス「slime」作成
slime.damage
slime.damage
  • 実行結果
slime appeared.  His hp is 166
slime's hp is now 151
slime's hp is now 133

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-08-10 (土) 01:52:04 (1802d)