目次
コンセプト
- 残念ながらこのコンテンツは授業に出席していることを前提として書きます。
- 残念ながら答えは載せません。自分で書いた方が楽しいと思うので。
- 基本をじっくり、分かりづらいところをしっかり、残りはさらりと。
- 「徐々に」増えていく予定。
基本的なこと
環境を作る
慣れないうちは
頭の中だけで考えてソースコードとにらめっこしててもしょうがないので、紙に自分がどういう処理をさせたいのか、何が起きたらどう動いて欲しいのかをまとめたフローチャートを作ってみると良いと思います。
インデント
ソースコードを読みやすくするためにインデント(字下げ)をしましょう。
インデントをするときはTabキーを押します。Emacsを使っているならば、Tabキーを押すだけで適切なレベルにインデントがされるでしょう。
def branch(x, y)
if x < y
return x
else
return y
end
end}
インデントの意味は&bold(){対応関係がわかりやすくなる}ことです。&br()
例えば、「def branch(x,y)」に対する「end」は同じレベルでインデントされている(というかインデントされていない)最終行のものです。
*Rubyレファレンス
**コメント
#highlight(ruby){
#シャープ(#)で始まる行はコメントです
#処理には全く関係ないので何書いても大丈夫です
#でもコンピュータ的に問題ないだけであって
#ソースコードを読んだ人間には見えるので
#あまりいろいろなことを書くのも考え物です}
**演算子
|+|加算|
|-|減算|
|*|乗算|
|/|除算|
|%|余り|
|**|冪乗|
|x>y|xがyより大きい|
|x>=y|xがy以上|
|x==y|xとyが等しい|
|x<=y|xがy以下|
|x<y|xがy未満|
|x!=y|xがyと等しくない|
**制御構造
***条件分岐
条件分岐はif文を用います。
#highlight(ruby){
if 条件式
実行内容
elsif 条件式
実行内容
else
実行内容
end}
elsifとelseは省くことも出来ます。elsifは複数書くこともできます。
処理される順序はif→elsifを上から順に→elseで、どれか一つが実行されたらendの後に飛びます。
***繰り返し
繰り返しを扱う代表的な構文はfor文とwhile文です。
****for文
#highlight(ruby){
for 変数名 in 範囲
実行内容
end}
たとえば1から10まで足した結果を知りたいとき、以下のように書きます。
#highlight(ruby){
total = 0
for i in 1..10
total += i
end}
これを実行すると、iの値が1,2,3,...,10と増えながらループが回り、最終的にtotalには55という値が代入されている状況になります。
範囲指定の方法は大まかに2つあり、
-「0..10」ピリオドが2つだと、左の値から右の値まで順番に代入していきます。ふつうのやつ。
-「0...10」ピリオドが3つだと、左の値から右の値-1まで順番に代入していきます。配列を扱うときなどに便利です。配列の場合、配列の長さは10個でも、添字は[9]までしかないので、10個の値を順番に扱うことを明示するときに使います。
***while文
#highlight(ruby){
while 条件式
実行内容
end}
whileはもっと単純で、条件式が満たされている間ループを回し続けます。
ゲームオーバーになるまでゲームの処理を続ける時なんかに使うと思うとわかりやすいかとおもいます。
***関数定義
#highlight(ruby){
def 関数名(引数,引数,...,引数)
関数内容
end}
関数名にはifとかincludeとかの予約語は使えません。
引数は任意の数用意することができます。
#highlight(ruby){
#sqrt()を使うために数学関数を読みこみ
include(Math)
#距離を求める
def distance(x, y, s, t)
return sqrt((x-s)**2+(y-t)**2)
end
#呼び出し
distance(3.0, 4.0, 8.0, 3.0)}
***読み込み
授業中にやったのは数学関数を読み込む
#highlight(ruby){
include(Math)}
と、自作のファイルを読み込む
#highlight(ruby){
load("abs.rb")}
でしたね。
includeはrubyに付属しているライブラリを読み込むときに、loadは自作のファイルを読み込むときに使います。
includeには拡張子をつける必要はありませんが、loadは拡張子が必要であることを忘れないようにしてください。
*テクニック
**再帰
再帰とは、&bold(){関数が自分自身を呼び出すことによって実現される処理}のことです。&br()
端的に言ってしまえば、&bold(){漸化式}です。
#highlight(ruby){
#与えられた自然数までの自然数の総和を返す
def sum(n)
if n == 1
return 1
else
return sum(n-1) + n
end
end}
漸化式で書くと、
$$S(n) = \begin{cases
1 & (n=1) \\ S(n-1)+n & (otherwise)\end{cases}$$
とまぁこういうことですね。
慣れない内は頭の中だけで考えて再帰を書こうとすると混乱するので、紙か何かに書き出しながら漸化式っぽく考えてみるのが良いと思います。
オブジェクト指向
第8章に突入し、オブジェクトとかいうものが出てきました。
おそらく意味不明でしょうから、解説を書いていきたいと思います。
オブジェクトとは?
オブジェクトはその名の通り、「もの」です。レコードがどうたらとかattr_accessorがどうたらとかはいったん忘れてください。
Rubyは「オブジェクト指向言語」というものなので、オブジェクトなるものを扱うことができます。
クラス
クラスはオブジェクトの設計図です。オブジェクトが「どのような要素を持っているか」や「どのような動きができるか」が書いてあります。
インスタンス変数
オブジェクトの持っている「要素」をプログラム上で表したものがインスタンス変数です。
メソッド
オブジェクトができる「動き」をプログラム上で表したものがメソッドです。
わかりづらいので具体例で。
#テレビの設計図(class)
class テレビ
attr_accessor("幅","高さ","厚さ","値段") #インスタンス変数を設定
def initialize(price)
self.値段 = price
end
def テレ朝()
テレ朝を映します
end
def テレ東()
テレ東を映します
end
def お値段は()
値段を表示します
end
end
#レグザを作る
レグザ = テレビ.new(300)
レグザ.テレ朝() #レグザでテレ朝を映す
レグザ.テレ東() #レグザでテレ東を映す
レグザ.お値段は() #レグザの値段を表示する => 300と表示される
#アクオスを作る
アクオス = テレビ.new(400)
こんな感じです。
順番に見ていきましょう
まず、テレビというクラスを作っています。
テレビというクラスは、インスタンス変数を4つ、メソッドを4つ持っています。
attr_accessor("幅","高さ","厚さ","値段")
は、テレビというクラスは幅、高さ、厚さ、値段という4つのインスタンス変数をもっていることを表しています。
def initialize(price)
self.値段 = price
end
は、オブジェクトを作成したときの初期化メソッドです。少し後で出てきます。
「テレ朝()」だの「テレ東()」だの「お値段は()」だのは普通のメソッドです。
というところでテレビというクラスをもとにレグザというオブジェクトを作っています。
オブジェクトを新しく作ったときには、クラスで定義されている初期化メソッドが呼び出されます。
そうです。
def initialize(price)
self.値段 = price
end
これです。
newしたときに指定した引数(ここでは300)をpriceで受け取り、それをself(自分自身)の値段というインスタンス変数に代入しています。
まとめると「レグザというテレビを値段を300円として作る」ということを
でやっているわけです。
ではメソッドを呼び出しています。
このように、オブジェクト指向では「オブジェクト.メソッド」という書き方をすることによって、「オブジェクトに、自分の持っている機能を使うように指示」することができます。
さらに言うと、「いちいちどういう風に動くか教えなくても簡潔な指示を出すだけであとは勝手にオブジェクトがやってくれる」のが便利なわけです。
しかも、このメソッドはレグザ固有のものではなく、テレビというクラスをもとにアクオスとかブラビアとかいろんなテレビを作っても共通でテレ東()とかテレ朝()とかのメソッドを使うことができます。
最終更新:2013年12月05日 14:37