- 追加された行はこの色です。
- 削除された行はこの色です。
* Rubyの基礎 [#y63cd1c8]
* Rubyの基礎 [#hb7111cf]
#contents
** 言語仕様 [#e2560531]
** 予備知識 [#a6a9afed]
*** コメント [#d9f36a06]
Rubyでのコメントは、#以降の部分です。これは、シェルスクリプトやPerl等と同じです。
** Rubyにおけるコメント [#g15e82c6]
Rubyでは、シェルスクリプトなどと同じく、#から改行までがコメントとして認識される。
また、=beginと=endにはさまれた行は、コメント(正確にはドキュメント)とみなされる。
*** 定数 [#rc62a2b7]
リテラル文字列は、C/C++や、Perlと同じく、"で囲む。\nや\tなどのエスケープ文字も使える。Perlと同様に、変数とみなせるものは変数として展開される。また、#{...}という形で、式を記述できる。
[処理]
=begin
何か適当にドキュメントを書く
=end
[処理]
また、Perlと同様に、エスケープなしのリテラル文字列として、'で囲んだものも使える。
といったことができる。
[...]は、配列を表し、{...}は連想配列を表す。
** 定数 [#r71962d2]
Rubyで利用できる定数は次のようなものがある。
*** 変数 [#qd0afc43]
|定数の種類|例|解説|
|十進数値|100|十進の数値。|
|十六進数値|0x100|十六進の数値。|
|八進数値|0o100|八進の数値。|
|小数値|0.1|十進の小数数値。|
|エスケープ可能リテラル文字列|"current time is #{time}.\n"|エスケープ文字や変数(正確には式)を含められるリテラル文字列。|
|エスケープ不能リテラル文字列|'this is a pen.'|エスケープ文字(\\と\'を除く)や変数(正確には式)を含められないリテラル文字列。|
|パイプキャプチャ|`ls -la`|記述された文字列をコマンドとしてシェルで実行し、その出力結果を評価結果として返す。|
|ヒアドキュメント|'''後述する'''|ヒアドキュメント。|
|正規表現|/.../|正規表現を返す。|
|配列|[...]|指定された中身を持つ配列を返す。中身となる要素はカンマで区切って記述する。|
|連想配列|{...}|指定された中身を持つ連想配列を返す。中身となる要素は、鍵と値のペアを=>で連結し、カンマで区切って記述する。|
|シンボル|:[シンボル名]|Symbolクラスのインスタンスを返す。|
*** リテラル文字列における、エスケープ文字と式の埋め込み [#bd108d8d]
エスケープ可能なリテラル文字列には、\nや\tや\x41など、\記号と英数字を組み合わせたエスケープ文字が利用できる。
リテラル文字に変数を含めるには、#{ ... }を使う。これは、正確にはRubyの式を含めることができる。#{と}の間は、Ruby式の空間なので、"をエスケープする必要はない。
literal_string = "variable x equals #{ $x = "alphabet" }"
このとき、式にコメントを含めることができる。Ruby ver 1.7では、改行までで、それ以外のバージョンでは、コメントは#から}までである。
commented_equation = "variable x equals #{ $x = "alphabet" # ここはコメント}"
という感じで、コメントを入れることができる。Ruby ver 1.7では、トと}の間に改行が必要となる。
*** ヒアドキュメント [#m36fc7f4]
ヒアドキュメントは、長いテキストを一括して記述する方法である。
<<[マーク]
ここに、何行でも好きなこと([マーク]だけの行は書けない)を書いて良い。
[マーク]
[マーク]は、識別子のルールに則って決めると良い。
もし、最後の[マーク]をインデントしたければ、最初の<<と[マーク]の間に、-を入れると良い。
2.times {
<<-[マーク]
なんかいろいろ書く。
[マーク]
最初の例だと、終わりを示す[マーク]だけの行は、インデントなどをすることができないが、後の例ではインデントが許される。
なお、[マーク]を記号で囲むことで、エスケープ文字や式展開の可否を変えることができる。"で[マーク]を囲むと、エスケープ文字や式展開が利用可能になる。'で囲むと、エスケープ文字や式展開が利用できなくなる。`で囲むと、コマンドとして実行した結果を受け取ることができる。
evaluated = <<"__TEXT__"
#{ $x = "alphabet" }
__TEXT__
not_evaluated = <<'__TEXT__'
#{ $x = "alphabet" }
__TEXT__
directory_listing = <<`__TEXT__`
ls -la ./
ls -la res/
__TEXT__
*** パイプキャプチャによるコマンドの実行 [#hca21786]
パイプキャプチャは、コマンドの実行結果を受け取りたいときに役立つ。また、単純にコマンドを実行したいだけのときも役立つ。
directory_listing = `ls -la`
これは、Unix/Linuxでおなじみの、ディレクトリリストを文字列として取り込んでいる例である。
** Rubyの識別子規則 [#x764481c]
Rubyの識別子は、英数字と_から成る。ただし、数字から始まってはならない。
また、記号で始まらない識別子のうち、予約語と同じ綴りになるもの(ifとかelseとかreturnとか)は利用できない。
*** %記法によるデリミタの変更 [#wc62c9db]
%記法を利用することで、デリミタを標準のものから変更することかできる。?の部分には、改行を含んだ非英数字を使うことができる。括弧系を使う場合、開きと閉じで対応するものを使う必要がある。
|%記法|意味|等価式|
|%Q?...?|エスケープ可能リテラル文字列。|"..."|
|%q?...?|エスケープ不能リテラル文字列。|'...'|
|%x?...?|パイプキャプチャ。|`...`|
|%r?...?|正規表現。|/.../|
たとえば、次のように使える。%記法を使わない場合にどうなるかを考えて比較してみると良いだろう。
%r#http://www.hogehoge.com/#
** 変数 [#h487f390]
*** 変数の種類 [#vb0fe97b]
Rubyの変数にはいくつか種類がある。
|変数の種類|特徴|解説|
|ローカル変数|英小文字から始まる|属するスコープの外からは見えない、ローカルな変数|
|グローバル変数|先頭に$が1つだけ付く|どのスコープからでも見ることができる、グローバルな変数|
|インスタンス変数|先頭に@が1つだけ付く||
|クラス変数|先頭に@が2つだけ付く||
|クラス定数|英大文字から始まる||
vという名前のローカル変数のスコープを確認するには、次の2回繰り返すブロックにより確認できる。
*** 基礎文法 [#u3fc7076]
2.times {
p defined?(v) # vが定義(宣言)されているか表示。未定義(未宣言)なのでnilが出るはず。
v = 1 # vを定義(宣言)する。
p v # vの内容を表示する。1が表示される。
}
つまり、ローカル変数vは、そのスコープとなるブロックを抜けると、完全に消滅する。
** クラスとオブジェクト [#r54cb30e]
*** 定義済みの定数変数 [#c110c576]
Rubyでは、次のような定義済み定数変数がある。プログラマが勝手に書き換えたりはできない。
** クラスの定義 [#h57a4c5f]
|定数変数|内容|
|nil|無効な値などを表す。falseと同じ意味にとられる場面がある。|
|true|真値を表す。|
|false|偽値を表す。|
|self|クラスインスタンス自信を表す。|
** オブジェクトインスタンスについて [#ha483123]
** 文法 [#gbabb3cb]
*** 基本事項 [#sbae6ca3]
Rubyでは、多くのことは式で記述する。つまり、多くのことは何らかの値を持ち、式として評価可能であるということである。これは、条件分岐や繰り返しなども含まれる。
Rubyでは、1行に複数のことを記述できない。改行によって区別される1行には、一つの処理だけが記述できる。しかし、実際には、Rubyは式が多いので、式を並べたり組み合わせたりすることで、複雑な処理を実現できる。
*** 代入 [#j01756b7]
代入は、=によって行う。
alpha = beta
gamma = omega
*** 条件分岐 [#j03ae9ce]
条件分岐は、次のように行う。
if [式] then
[処理]
elsif [式] then
[処理]
else [式] then
[処理]
end
elsifやelseは、必要なければなくてもかまわない。これは、他の言語と同じである。
また、ifの否定形として、unlessを使うことができる。書き方はifと同じで、ifをunlessにすれば良い。ただし、elsifに相当するものはない。
条件分岐を省略して記述する方式として、Perlのような書き方ができる。ifとunlessの両方を使える。
[式1] if [式2]
[式1] unless [式2]
thenやelseやendは必要ないし使えない。全体が式とみなされるので、[式2]が成立していれば、[式1]に、そうでなければnilが式の評価結果となる。
更に、多くの条件を書く方式として、case-when方式がある。
case [式]
when [式1]
[処理]
when [式2]
[処理]
else
[処理]
end
なお、この方式での比較は、===演算子で行われることに注意すること。==ではない。
[式1]や[式2]は拡張型があり、カンマで区切って複数の値を記述したり、*を前置して配列を展開したりできる。
ary = [1, 2, 3]
case x
when *ary
[処理]
end
は、
case x
when 1, 2, 3
[処理]
end
と等価である。
case-when自体も式なので、成立した処理が返す値を式の値として返す。つまり、処理の中で最後に評価した式の値が返る。
*** 繰り返し [#z614fbba]
一定回数繰り返すには、次のようにすれば良い。
10.times {
p "loop"
}
これで、10回繰り返す。
より複雑な条件での繰り返しは、whileやuntilを用いて記述できる。
while [式]
[処理]
end
until [式]
[処理]
end
[式]が真である間、[処理]を繰り返す。untilは、[式]が偽である間、[処理]を繰り返す。
ifと同様に、whileやuntilも後置することで省略形にできる。
whileやuntilは、後述する引数付きのbreakで抜けない限り、式の値としてはnilを返す。
列挙による繰り返しは、forによって行える。
for [変数] in [式]
[処理]
end
[式]の値のeachメソッドが返すものを、一つずつ[変数]に代入し、[処理]を繰り返す。
これは、変数のスコープを除いて(forは、ローカル変数用のスコープを新しく作らない)、次と等価である。
[式].each {|変数| [処理]}
ループの制御は、break、next、redo、retry、で行う。
breakは、ループや列挙を抜ける(強制的にループを終了させる)際に使用し、引数として式を与えることができる。引数を与えると、それがループの式としての評価値になる。
nextは、ループや列挙を次のものに飛ばす際に使用する。
redoは、条件として指定した式の評価などを行わずに、ループの最初に戻る際に使用する。
** 他言語との比較 [#v72cae13]
*** C/C++との比較 [#q90d7c65]
Rubyでは、1行に1つのことを書く。セミコロンは必要ない。
変数は、大文字小文字で役割そのものが変わることがある。また、変数に型はなく、役割さえ間違えなければ、どんな型でも入る。また、代入などによる変数の定義は、変数の宣言を兼ねているので、特別に変数を宣言する必要はない。また、未定義(未宣言)の変数は利用できない。
多くの処理は式である。if文の結果が存在し、それを変数に代入することもできる。式としての値を持たなさそうなものは、nilを返すことが多い。
forは、役割が違う。C/C++風の使い方はできない。
** 参考リンク [#b87a1c75]
- [[公式チュートリアル>http://www.ruby-lang.org/ja/20020310.html]]
- [[公式リファレンス>http://www.ruby-lang.org/ja/man/]]