Ymotoのブログ

主にプログラミング学習記録

Ruby入門

[Ruby入門]を読みながら写経しました。新しく覚えた箇所をメモ書きしておきます。

文字列

文字列オブジェクトに文字列を追加

文字列 << 追加する文字列

or

文字列.concat(追加する文字列)

str = 'Tokyo'
str << ',Japan'

str = 'Tokyo'
str.concat('Kyoto')

シングルクウォートとバッククォートの違い

バッククォートは文字列中に改行文字\nや、式展開#{ }を埋め込むことができる。シングルクウォートでは上記の文字が文字列として認識される。

エスケープ文字

手前に\をつけることでその文字を文字列として認識される。

%記法

%記法を使うとエスケープ文字を使用する必要がなくなる。 * %q! !はシングルクウォート * %Q! !%! !はダブルクウォート ! ! だけでなく、他の記号も区切り文字としてしようできる。

ヒアドキュメント

複数行の長い文字列を作成する場合に使う。 <<識別子 1行目 2行目 3行目 ・・・ 識別子 識別子をシングルクウォートで囲むと式展開が無効になり、ダブルクウォートで囲むと有効になる

バックスラッシュ記法

キーボードから直接入力できない文字を記述するために使われる。

文字列の中でxを使用したい場合、\xを使用する。これを文字xをエスケープするという。"エスケープするには\"と記述する。

数値と四則演算

ビット演算子

&: ビットAND :演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットがともに1の場合だけ1にする。

OR : ビットOR :演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットのどちらかが1の場合に1にする。

^ : ビットXOR :ビットの値が異なる場合にだけ1にする

~ : ビット反転 :演算子の右辺の値の各ビットに対して1の場合は0に、0の場合は1にする。

シフト演算子

ビット演算子の一つで、数値の各ビットを左または右にシフトさせるための演算子

2進数において左へ1つビットをシフトさせることは値を2倍にすることで、右へ1つビットをシフトさせることは1/2にすることに相当する。

左シフト

a << b : 左辺の数値を右辺の値だけ左にシフト。左端からはみ出した部分は削除され、空いた右端には0が格納される。

0000000001011 = 11
-------------
0000000010110 = 22

右シフト

a >> b : 左辺の数値を右辺の値だけ右へシフト。

0000000001011 = 11
------------------
0000000000101 = 5

定数と変数


定数は変数と同じく数値や文字列などのオブジェクトに名札をつけるために使用するが、定数の場合は例外を除き、一度オブジェクトを代入すると変更ができない。

定数に名前を付ける時のルール

1) 1文字目は英大文字
2) 2文字目以降は英数文字、アンダーバー(_)
3) 予約語は使用できない
組み込み定数

関係演算子と論理演算子の優先順位

(優先順位が高い)
  !  ~
  **
  *  /  %
  +  -
  <<  >>
  &
  |  ^
  >  >=  <  <=
  ==  !=
  &&
  ||
  ..  ...
  ?:
  =
  not
  and  or
(優先順位が低い)

条件演算子

条件式の結果によって異なる値を返す演算子 条件式 ? 真のときの値 : 偽のときの値

result = 80
flag = result > 60 ? "合格" : "不合格"

メソッド

トップレベ

クラス定義の中に記述されたのではなく、定義の外側にあるもの.メソッドはクラスの中に記述するものだが、トップレベルにも記述することができる。(Kernelモジュールの中に追加される)

Kernelモジュール

全てのクラスから参照できるメソッドを定義しているモジュール。

self

メソッド内で実行されるとそのメソッドを実行しているオブジェクトを示す

クラスとインスタンス

インスタンスメソッド

クラス内で定義されたメソッド。通常のメソッドはプログラム内からいつでも呼び出せるのに対し、インスタンスメソッドはそのクラスから作成されたオブジェクトしか呼び出すことができない。

アトリビュート、プロパティ

オブジェクトから取得したり、設定できる値

ローカル変数とインスタンス変数

  • ローカル変数: メソッドやブロックの内部で作成される変数。メソッドやブロック内部でのみ有効
  • インスタンス変数: 同じオブジェクトの内部で共有される変数。@ではじめる。

アクセス制御

クラス内での他のメソッドから実行されるだけのメソッドを定義するとき、オブジェクトから実行できないようにするためにアクセスを制限する。
public: オブジェクトからインスタンスメソッドとして実行可能
privete: クラス内の他のメソッドからのみ実行可能

※ 通常のメソッドは、指定をしない場合publicとなるが、initializeメソッドだけは常にprivateとなる。

モジュール

クラスとの違い

  • インスタンスを作成することはできない
  • 他のモジュールやクラスを継承できない

使用法

関数のようにモジュール内に定義されたメソッドを実行するか、クラスの中にincludeする。

Numericクラス

四捨五入:round

大きい方の整数へ変換する: ceil

小さい方の整数へ変換する: floor

整数を文字列に変換 基数を指定して形式変換: to_ s(base)
例: 12.to_s(2) →1100

文字コード取得: chr

商の整数部分を求める: div

整数または浮動小数点数の商を求める: quo, /

絶対値を取得: abs

Stringクラス

文字列を検索する(左から)。見つかった場合は文字列の左端の位置を返す index(pattern[, pos]) 第一引数には検索する文字列または文字コード、第二引数には検索を開始する位置を指定する。省略した場合は先頭から検索する str = "Hello" pos = str.index("ll") p pos 2
文字列を検索する(右から)reindex(pattern[, pos]) str = "Hello" pos = str.rindex("l") p pos 3
文字列が含まれているかどうか検索include?(substr) str = 'Hello'
check = str.include?("el")
文字列を削除する delete(str[, str2[, ...]]) 引数に指定した文字列が含まれていた場合は削除する。複数削除したい場合はカンマで区切って続けて引数に指定する。 str = 'Yo!world' str.delete!('Y')

Arrayクラス

Hashクラス

開始と終了位置を指定して取得する 1.新しい配列 = Arrayオブジェクト.slice(start..end)

2.新しいArrayオブジェクト = Arrayオブジェクト[start..end]

ary = ['こん', 'にち', 'は', 'ruby']

newary = ary[1..3]

→newaryに'にち','は','ruby'が入る。

開始と要素数を指定する 1.新しい配列 = Arrayオブジェクト.slice(start, len)

2.新しいArrayオブジェクト = Arrayオブジェクト[start, len]

ary = ['東京', '京都', '大阪', '名古屋', '福岡', '札幌']

newary = ary[1, 2]

→newaryに、'京都', '大阪'が入る。

指定の位置に新しい要素を挿入する Arrayオブジェクト[start, 0] = 新しい要素 ary = ["東京", "大阪", "名古屋", "福岡", "札幌"]

ary[1, 0] = ["横浜", "神戸"]

ary = ["東京", "横浜", "神戸", "大阪", "名古屋", "福岡", "札幌"]

配列を平坦化する Arrayオブジェクト.flatten ary = [1, 2, [3, 4, 5], 6, 7]

newary = ary.flatten

puts newary

[1, 2, 3, 4, 5, 6, 7]

配列の中の同じ要素を取り除く Arrayオブジェクト.uniq ary = [1, 2, 5, 2, 3, 5]

newary = ary.uniq

p newary

[1, 2, 5, 3]

配列の中の「nil」を取り除く Arrayオブジェクト.compact ary = [1, 2, nil, 3, 4, nil]

newary = ary.compact

p newary

[1, 2, 3, 4]

指定した値と等しい要素をすべて取り除く Arrayオブジェクト.delete(val)

引数「val」と等しい要素を取り除く

ary = [1, 2, 3, 5, 4, 3]

ary.delete(3)

p ary

[1, 2, 5, 4]

指定したインデックスの要素を取り除く Arrayオブジェクト.delete_at(pos)

引数「pos」であらわされるインデックスの位置にある要素を取り除く

ary = [1, 2, 3, 5, 4, 3]

ary.delete_at(2)

[1, 2, 5, 4, 3]

ブロック内での処理の結果がtrueの要素を取り除く Arrayオブジェクト.delete_if {|x| ...} ary = [1, 2, 3, 5, 4, 3]

ary.delete_if {|x| x % 2 == 0}

p ary

[1, 3, 5, 4, 3]

要素の順番を逆にする Arrayオブジェクト.reverse ary = [1, 2, 3, 4, 5]

newary = ary.reverse

 不明な箇所

クラスメソッドとインスタンスメソッド。モジュール

ハッシュからキーと値を取り除く Hashオブジェクト.delete(key) h = {'suzuki' => 43, 'tada' => 54, 'nanri' => 19}

h.delete('suzuki')

ハッシュからキーと値を取り除く(指定したキーが存在しないばあいの処理を記述する) Hashオブジェクト.delete(key) {|key|...} t = {'yamada' => 14, 'satou' => 24, 'saitama' =>83}

t.delete('suzuki'){|key| puts "#{key}はありません"}

ブロック内で処理をし、結果がtrueの要素を取り除く Hashオブジェクト.delete_if {|key, value| ...} t = {'yamada' => 12, 'tanaka' => 65, 'suzuki' => 54}

t.delete_if {|key, value| value < 60}

複製したハッシュオブジェクトからキーと値を取り除く Hashオブジェクト.reject {|key, value| ...} h = {"suzuki" => 87, "itou" => 76, "yamada" => 69}

newHash = h.delete_if {|key, value| value < 80 }