この章ではハッシュについて説明します。
ハッシュとは配列と似ていますが、配列は複数のデータをまとめて入れることができますが、ハッシュも基本的な仕組みは同じで、複数のデータをまとめて入れることができます。
では配列とハッシュの違いは何か?
大きく違う点は配列は要素を「添え字」で管理していましたが、ハッシュは「キー」で要素を管理します。
配列の場合は以下のように添え字で要素を管理していました。 ハッシュの場合は次の例のように添え字の代わりに「文字列であるキー」を指定します。
ハッシュの場合は個々の要素をキーによって管理します。
では例をみてみましょう。 ハッシュの基本構文は以下の通りです。 キーとはの箇所で、値はの箇所です。
配列は前からと順番に数えていましたが、ハッシュには要素間の順番はなく、で関連付けして記述します。
つまり、はという関連付けで記述しています。
出力する時にはのようにという形式で書けばキーに対応する値が出力されます。
次の例では以外の方法でハッシュの要素を指定しています。
それはfetchを使う方法です。 では例をみてみましょう。 この例では紺野に対応する値が出力されるので、結果は34です。
もしくは以下のように変数に入れてから出力することも出来ます。 キーに対応する値をのように変数に結果を入れてから出力させても問題ありません。
結果は以下の通りです。 printを使ってのように存在しない要素を出力する場合は要素が存在していなくてもエラーにはなりませんが、fetch を使ってのように存在しないキーを指定して出力しようとするとと言うエラーが発生します。
結果は以下の通りエラーです。 もしキーが存在しない時にデフォルト値(決まっている値)を出力させたいのならばの20のようにデフォルト値を設定します。 では例をみてみましょう。 もしくは この2つの例はキーであるが無い場合でも20が出力されます。
では次に進みます。
次はの場合はデフォルト値しか出力されませんでしたが、存在しないキーとデフォルト値両方を出力させたい時は以下のように記述します。 変数名はrではなくても、自由に付けてください。
結果は以下の通りです。 以下のようにキーが存在する場合にはその値が出力されます。
また、の部分は行を変えて書くことができます。 結果は以下の通りです。 次はキーが存在しなかった場合、キーそのものを出力する方法について説明します。 のように存在していないキーを出力するとブロック内の変数kに渡されて、そのキーが出力されます。
のように存在するキーを指定した場合はその値が出力されます。
結果は以下の通りです。 次の例は先ほどの例の変形型でキーが存在しなかったら、そのキーとその値をハッシュの新たな要素として入れる形式です。
つまり次の例はと言う要素を新たにハッシュであるnameに加えています。基本構文は以下の通りです。 例をみてみましょう。 結果は以下の通りです。
月: 2015年5月
配列のその他の知識を得よう
この章では配列の要素を一度に取り出す方法について説明します。
今までは配列の要素をのように1つ1つ取り出していましたが、eachを使うことでまとめて取り出すことが出来ます。
詳しい説明は例の後に行います。 以下の構文で書くことで配列の要素が1つずつ変数に代入されて、実行文で出力されます。
以下の構文の変数名は自由に付けてください。 上の例のeach doの箇所は次のように書き替えることが出来ます。 このように書くことで配列のすべての要素を順番に繰り返し取り出してくれます。
出力される順番は以下の通りです。
つまり、配列animalの要素が順に変数iに入り、putsで出力されます。 結果は以下の通りです。 次は配列の要素がいくつあるのかを確認する方法について説明します。 配列のデータの数は以下の構文で取得できます。 この例では配列の要素が5つあるので結果は5です。
他の方法でも配列の要素数を取得できます。 結果は以下の通りです。 では説明をしていきます。
〇「配列.count」という構文で配列の要素数を取得できます。
例の結果は9です
〇という構文で指定した要素と同じ要素がいくつあるのかを取得できます。
この例では配列の要素である1が4つありますので、結果は4です。
次の例に進みます。 この例ではすべての要素をチェックしてという条件に一致した要素の数をカウントします。
つまり、要素の中で2で割り切れるのは2と4だけですので、例の答えは2です。
「==」は右辺と左辺がイコールという意味ですが、この記号は関係演算子と呼ばれています。
また、以下の構文に条件式がありますが、条件式の詳細は「条件分岐ifの公式1」で詳しく説明します。 以下の通り、結果を変数に入れることもできます。
またcountの中身は行を変えて書いてもいいです。
次の例も前例と同じ構文です。 「f+2==4」という条件に一致した要素の数をカウントしています。
条件にあう2が2つありますので、結果は2です。
次は「nil」について説明します。
nilとはオブジェクトが存在しないことを意味します。
つまり何もないと言う意味です。
例えば要素が存在しないのにも関わらず、その添え字を指定して出力するとnilが返されます。 animalの要素は5つしかないので、と書いて出力してもその要素は存在しないのでnilが返されます。
結果は以下の通りです。 もう一つnilの例を見てみましょう。 =>要素数を指定して配列を作っても、要素が何も入っていない時にはnilが返されます。
pで出力すると解りますが、と、出力されます。 そのnilを省いた配列を作成したい場合はという構文で書きます。
この構文はnilの要素が省かれた新たな配列を作成します。
では例をみてみましょう。 デバック用のpで出力するとnilが省かれていることがわかります。
結果は次の通りです。
配列のその他の作成方法を知ろう
配列の作成方法は前の章で説明した方法だけではなく、他にも3つありますので、この章で説明します。
1つ目の配列の作成方法をみてみましょう。 初めに と言う形式で配列の要素数を指定します。
つまり、いくつのデータを作るのかを指定します。
この例ではデータを2つ入れるので要素数を2にしています。
その次に以下のように配列にデータを2つ入れます。 カラの配列を作ってから、後からデータを入れたい場合にはという形式でカラの配列を作成してから、その後にデータを入れていきます。 結果は以下の通りです。 次は2つ目の配列の作成方法をみてみましょう。 「要素数とデータ」を同時に記述したい場合はという形式で書きます。
その場合すべての要素に同じデータ(この例の場合は猫)が入ることになります。
結果は以下の通りです。
次は3つ目の配列の作成方法をみてみましょう。 と言う形式で配列を作成します。
この例では紙面の都合で配列の要素を2行で書いています。
結果は以下の通りです。 という構文で配列の複製を作成することが出来ます。
この例の場合にはanimalを複製してanimal5という新たな配列を作成しています。
結果は以下の通りです。
この章では配列について説明します。
これまでの変数は1つのオブジェクトだけを扱うことができました。
つまり、他のオブジェクトを入れようと思うと上書きされて、前のデータは消えてしまいました。
それに比べて配列は複数のデータをまとめて入れることができます。
普通の変数では と別々の変数名でそれぞれのデータを入れなければいけませんが、配列を使うとと、まとめてデータを入れることができます。
このように配列は1つの変数名で多くのデータを入れることができるのです。
上の例のように同じ目的で使用する可能性のある複数のデータは1つにまとめてしまい、1つの変数で複数のデータを管理できると便利です。
このような時に配列を使用します。
配列の基本構文は以下の通りです。 配列の要素には違う種類のオブジェクトも混ぜて入れることが出来ます。
例えばのように数値と文字列を混ぜて入れることも出来ます。
もうひとつの配列の書き方としての中に空白で区切って書く方法があります。この書き方はダブルクォートでデータを囲う必要がありません。
次に「添え字」について説明します。 上の配列を書き換えると次のようになります。 [ ]の中に入っている数値のことを添え字と言います。添え字とは配列の中のどこにデータが入っているのかを管理する番号です。
例えばコインロッカーには番号が付いていますが、番号があるからこそ、どこに自分の荷物があるのかが分かるわけです。
添え字も考え方は同じで、番号によりデータを管理します。
では先ほどの例を元に添え字の説明をしていきます。
配列の1番前の要素である0には猫が入っていて、配列の前から2番目の要素である1には犬が入っていて、配列の前から3番目の要素である2にはライオンが入っていて、配列の前から4番目の要素である3には象が入っていて、配列の前から5番目の要素である4にはネズミが入っています。
添え字は0から順番に番号が付けられていきます。1から添え字を付けていくわけではないので、注意してください。
もう一度繰り返します。
配列の1番前、つまりには猫と言う要素が入っていて、配列の前から2番目、つまりには犬と言う要素が入っていて、配列の前から3番目、つまりにはライオンと言う要素が入っていて、配列の前から4番目、つまりには象と言う要素が入っていて、配列の前から5番目、つまりにはネズミと言う要素が入っています。
次は配列の要素の出力方法について説明します。
配列のデータを出力するにはという構文で書きます。
例えばの場合には猫が出力されます。
このようにprintに配列と添え字を指定するとそれに応じた要素を配列から取り出すことができます。
次は配列の要素の上書き方法について説明します。
例えばの要素を他のデータで書き替えたいのであればのように同じ配列の添え字に新たなデータを入れます。
これでネズミと言う要素はシマウマと言う要素で上書きされたことになります。
添え字にはマイナス指定も出来ます。
例えばはと同じ意味になります。
添え字のマイナス指定の場合は配列のデータの末尾からと添え字を指定します。
一気に何個かの要素を他の要素で置き替えたい場合は以下のように書きます。 の中のは範囲演算子と言います。 「0..2」は0番目から2番目までの要素を意味します。
次はカラの配列の指定方法について説明します。
のように初めから中の要素が決まっているのならばこのように書けますが、まだ入れるデータが決まっていない時にはカラの配列を用意して、その中に後からデータを入れることも出来ます。
下の例を見てみましょう。 出力結果は以下の通りです。 では説明をしていきます。 その後に と、配列に対してデータを入れていきます。 =>先ほどは範囲演算子を使って、データを代入しましたが、範囲演算子を使って出力することが出来ます。
のように指定した範囲が配列の要素数を超えている場合は最後の要素の添え字を指定したのと同じとみなされます。
この例ですとと同じ意味を持ちます。
範囲演算子を使って出力すると配列として出力されるので、結果はのようにカッコの付いた状態で出力されます。
次は以下の箇所の説明をします。 =>p はデバッグ用で出力する時に使います。
デバックとはプログラムの途中で思った通りに出力がされているのか確認することを意味します。
この例ではp animalと書いてありますのでと出力されます。
pで文字列と数値を出力しますと以下の通り、文字列の場合にはダブルクォートで囲まれて出力されますので、変数には文字列が入っていると確認できますし、数値の場合にはダブルクォートが入っていない状態で出力されますので、変数には数値が入っていると確認できます。 出力結果は以下の通りです。
次の例は添え字にマイナス値を指定する方法について説明します。 先ほども説明しましたが、添え字に負の整数を指定した場合には配列の一番後ろの要素から添え字をと数えます。
つまり、とは同じ意味です。
この例ではネズミをタイガーに変更しています。
結果は以下の通りです。 負の添え字はデータを書き替えるときなどに使用しますので、以下のようにマイナスの添え字で最初から値を設定することはできません。 これを実行しようとすると以下のようなエラーが発生します。
ヒアドキュメントについて知ろう
この章ではヒアドキュメントについて説明します。
普通の文字列はダブルクォートやシングルクォートで囲まれたものですが、この他に以下の構文のようにから最後のまでを文字列として扱う手法もあります。 識別子名には自由に決めた名前を付けてください。
初めの識別子をダブルクォートで囲むと変数が展開され、シングルクォートで囲むと変数は展開されません。
また、ヒアドキュメントに変数を埋め込む時にはという形式で埋め込みます。
では例をみてみましょう。 「EOS」がダブルクォートで囲んであるので、ヒアドキュメントの中の変数は展開されます。
結果は以下の通りです。 次の例は先ほどの例を少し変えて、ヒアドキュメントを変数に入れてから出力しています。
このような事もできますので覚えておいてください。 次の例は最初の識別子を以下のようにシングルクォートで囲う方法で出力します。 結果は変数が展開されませんので、変数名がそのまま表示されます。 次はヒアドキュメントの注意点について説明します。 上のように最後の識別子の前後にスペースやコメントなどを置くことができません(エラーになります)。
しかし、最後の識別子の前後にスペースをおいてもエラーを起こさない方法があります。
それは「<<」と最初の識別子の間にを付けることです。
結果として、以下のように最後の識別子の前にスペースがあっても、エラーを起こさないで済みます。
では例をみてみましょう。
エスケープシーケンスについて知ろう
この章ではエスケープシーケンスについて説明します。
エスケープシーケンスとは、ダブルクォートやシングルクォートなど文字列として入力することが出来ない特殊な文字をを使って表現します。と、ダブルクォートを含めて出力させたいと思って以下のように書いてもエラーが出ます。
理由はダブルクォートがRubyでは文字を囲むという特殊な意味を持っているからです。 つまり、以下のカッコを囲んだ対応関係で解釈されてしまいます。 ダブルクォートをとして使いたい場合にはの前にを入れます。 これでと出力されます。
次の例をみてみましょう。 結果はと出力されますが、タブが挿入されているのが分かります。
次の例をみてみましょう。
シングルクォート内で使うことが出来るエスケープシーケンスはだけです。
Rubyで計算しよう2
Rubyで計算しよう1
この章では数値オブジェクトの計算について説明します。
数値オブジェクトは整数と浮動小数点数のことを言います。
整数は10進数、8進数、16進数などで表せますが、10進数は1,2などの我々が普段使っている数字です。
8進数は先頭に「0」を付けて028などと書きます、16進数は先頭に「0x」を付けて0x41などと表現します。
浮動小数点数は「3.2」などの小数点を持った数値です。
では例をみてみましょう。 では説明していきます。 では次の例をみてみましょう。 結果は以下の通りです。 では説明をしていきます。 =>浮動小数点数同士の計算を行っています。
=>足し算や引き算より掛け算や割り算を先に計算します。
どうしても足し算や引き算の方から計算したい場合はのようにカッコで囲ってください。
=>**は割り算や掛け算より先に計算されますので、当然足し算や引き算より先に計算します。
=>浮動小数点数と整数の計算の結果は浮動小数点数になります。
=>これは整数同士の計算なので結果も整数です。
この場合、小数点以下は切り捨てられるので正確な計算は出来ません。
=>浮動小数点数と整数の割り算の計算の結果は小数点まで求めることが出来ますので、正確に計算することが出来ます。
次の例は数値を変数に入れてから計算を行っています。
このように変数同士の計算も行うことができます。 結果は以下の通りです。
この章では定数について説明します。
定数は基本的には変数と同じですが、一度データを入れると変数みたいに再度データを入れ直すことは出来ません(つまり上書きできません)。
ですので、プログラムの最後までデータが変わらないのであれば定数を使います。
例えば消費税額などほとんど変わらないデータは定数に入れます。
またRubyの定数はメソッド内での定義はできません(メソッドは後ほど説明します)。 先頭文字を大文字で書くと定数と認識されますが、基本的には定数名のすべてを大文字で記述してください。
また変数と同じで予約語は使用できません。
定数に入れるデータはオブジェクトと言いますが、今のところ、オブジェクトは文字や数値などと同じであると覚えておいてください。
では例をみてみましょう。 この例ではMANSIONという定数に12というデータを入れています。
出力する時には変数と同じでprint文を使います。
ここで以下のようにのようにデータを上書きしようとするとどうなるでしょうか。 結果は以下のようなエラーになります。 自身で作る定数の他に、Rubyではあらかじめ定義されている定数があるのですが、これを組み込み定数と言います。
次の組み込み定数の幾つかはこの章以降に説明します。
この章では変数について説明します。
変数とはオブジェクトを入れることが出来る入れ物です。
オブジェクトのことはまだ説明していないので、ここではデータと思ってください(例えば文字や数値などもデータです)。
例えば携帯電話やフロッピーディスクにデータを記憶すると持ち運びが出来ますが、この携帯電話やフロッピーディスクに相当するものが変数です。
では例をみてみましょう。 後で詳しく説明しますが、nekoというデータをanimalという変数に入れて、print文で変数に入っているデータを出力しています。
このようにデータは変数に入れて、プログラム内で使っていきます。
結果は以下の通りです。 このプログラムの中のanimalが変数ですが、以下で変数の特徴について説明します。 先頭には@ や@@を使用することができますが、これらには意味がありますので、「クラスについて知ろう」の章で説明します。 予約語とはあらかじめRubyで定義済みの文字です。
例えば、「if」でしたらというRubyの内部機構で初めから装備されている機能ですので、使用することが出来ません。 「=」を代入演算子と言います。
このように書くことでnekoと言うデータをanimalと言う変数に入れることができるわけです。
データを入れる行為を代入と言います。
そして、その変数に入っているデータを出力するのが先ほど説明したprintや putsです。
つまり、はになります。
変数に格納されているデータが使用されることを変数展開と言います。
つまりデータを上書きできると言うことです。
その場合、前のデータも消えてしまいます。
では例をみてみましょう。 nekoというデータは後から入れられたdogで上書きされます。
結果は以下の通りです。 例えば のようにを入れないと以下のエラーが発生します。 もう一つの書き方としては変数をで囲みます。
その場合にはを入れる必要はありません。 animalを他の変数であるanimal2に入れていますので、animal2にもnekoが代入されています。
結果は以下の通りです。