Open43

Ruby Silver 学習まとめ(作成中)

はるはる

前提

  • トータル学習時間:約52時間
  • プログラミング初学者、RailsでCRUDや基礎的な機能の実装は調べながらできる。
  • Railsでもよく使うようなメソッドや概念などはまとめていない部分もある。
  • あくまで試験対策のためあえて簡潔に書いている部分もある。
  • 受験の詳しいレポートについては以下参照

https://lemonade37.hatenablog.jp/entry/2024/02/04/000900

はるはる

Timeクラス・Dateクラス

  • %Y:西暦4桁
  • %y:西暦下2桁

  • %D%x%m/%d/%yと同じ(例 02/03/24…2024年2月3日)
  • %d:日(01〜31)dayのd

  • %F%Y-%m-%dと同じ(例 2024-02-03
    to_sもこれと同じ
Date.today.strftime("%F") #=>2024-02-03
Date.today.to_s           #=>2024-02-03

  • %H:時 hourのh
  • %S:秒 secondのs

時間の足し算・引き算

  • 秒単位で計算をすることが可能。
  • Timeオブジェクトに数値を足す等すると数値を秒として計算し、その秒数経過後のTimeオブジェクトを返す。
    日時同士で足し引きすると、その和や差を秒数で返す。
time1 = Time.gm(2024, 2, 3, 10, 30,  0)
time2 = Time.gm(2024, 2, 4, 10, 30, 0) 

p time2 - time1

Time.gmメソッド

gmメソッドでは引数を(年, 月, 日, 時, 分, 秒)のように解釈してTimeオブジェクトで返す。

p Time.gm(2024, 2, 3, 10, 30,  0) #=>2024-02-03 10:30:00 UTC
はるはる

Rangeクラス

  • ..ドット2つ:1..5は1以上5以下Range.new(1, 5)と同じ。
  • ..ドット3つ:1...5は1以上5未満(5は含まれない)。

1..または1..nil:「上限なし」を表す
nil..nilまたはnil..または..nil:全範囲

はるはる

Hashクラス

ハッシュの作成方法

  1. そのまま定義する
    h = { a: 1, b: 2 }
    
  2. [] メソッド
    2通りの使い方がある。
    • self[key] = value
    • self.store(key, value)
    h = Hash[:a, 1, :b, 2]
    
  3. Hash.new
    この方法だとデフォルト値が設定可能。(デフォルト値の詳細については後述)
    設定時点でハッシュの中身は指定できない。
    h = Hash.new("デフォルト値")
    
  4. to_h メソッド
    h = [[1, 2], [3, 4]].to_h
    
  5. Hash{}

ハッシュから取得する系メソッド

  • hash[key]hash.fetch(key):ハッシュから指定したキーに紐づくを取得
  • hash.key(value):ハッシュから指定した値に紐づくキーのうち最初に見つけた1つを取得。引数に渡せる値は1つまで。(ハッシュ内でキーは基本重複しないが値は重複する可能性があるため)
  • hash.keys:ハッシュから全てのキーを配列として取得。引数は渡せない
  • hash.values:ハッシュから全ての値を配列として取得。引数は渡せない
  • hash.values_at(key, key, 〜):ハッシュから指定したキーに紐づく値を配列として取得。引数はいくつでも可
    hash = {a: 1, b: 2,c: 3}
    
    p hash.values_at(:a, :b) #=>[1, 2]
    
    p hash.values_at         #=>[]
    
  • hash.invert:ハッシュのキーと値を逆にした新しいハッシュを生成。引数は渡せない

ハッシュ内に存在するか確認系メソッド

  • hash.key?hash.has_key?hash.include?hash.member?:ハッシュ内にそのキーが存在するかを確認し、存在すればtrueしなければfalseを返す。全て同名の同じ挙動のメソッド。
  • hash.value?hash.has_value?:ハッシュ内にそのが存在するかを確認し、存在すればtrueしなければfalseを返す。

ハッシュから削除する系メソッド

  • delete:Hash クラスの delete メソッドは破壊的
    h = { a: 1, b: 2 }
    h.delete(:a)
    p h
    #=> { :b => 2 }
    # キーをシンボルの省略形で定義したハッシュでも、出力は `key => value` の形で出力される。
    
  • clear破壊的 にハッシュの中身をクリアする。
    h = { a: 1, b: 2 }
    h.clear
    p h
    #=> {}
    

ハッシュのデフォルト値の設定方法

ハッシュの値を取り出す時に存在しないキーを指定すると nil が返るが、この時デフォルト値を設定しておくと、nil ではなく設定した デフォルト値 が返る。
意図せず nil が発生しないために設定しておくことが多い。

  1. Hash.new を使ってハッシュを作成する。
    hash = Hash.new("デフォルト値")
    p hash[:hoge]
    #=> "デフォルト値"
    
  2. default メソッドで下記のように代入すると、デフォルト値にその値を設定できる。
    hash = Hash[]
    hash.default = "hoge"
    p hash.default
    #=> "hoge"
    

関係するメソッドについて

  • default:上記のように、デフォルト値が設定されていればそれを返す。default メソッドを使って代入すると設定もできる。
  • default_proc:ハッシュのデフォルト値をブロックを使って動的に決定するために使われるメソッド。デフォルト値をアクセスされたキーに応じて変更したいときに便利。
    このメソッドは、そのブロックのデフォルト値を取得することと、デフォルト値を設定することができる。
    default_proc メソッドでデフォルト値を設定する場合、ブロックを直接渡すのではなく、proc メソッドを使って Proc オブジェクトに変換してから代入する 必要がある。
    hash = Hash.new { |h, k| "#{k}は存在しないキーです" }
    p hash.default      #=>nil
    p hash.default_proc #=>#<Proc:0x000014e9e367fe08>
    p hash[:hoge]       #=>"hogeは存在しないキーです"
    
    puts "---"
    
    hash.default_proc = proc { |h, k| "#{k}というキーは存在しません" }
    p hash.default_proc #=>#<Proc:0x00001532a916ed60>
    p hash[:hoge]       #=>"hogeというキーは存在しません"
    
はるはる

イコール系

イコールの数

  • =:代入
  • ==:値が等しい。
  • ===:オブジェクトの型の一致や条件の一致を柔軟に判断するために使われる。case文で使われることが多い。(範囲に含まれるか、正規表現にマッチするか)

eql?とequal?

  • object.eql?(object2):レシーバと引数が等しいとtrueを返す。引数がないとエラーになる。(AugumentError)
  • object.equal?(object2):レシーバと引数の同一性(より厳密)までチェックする。等しいとtrueを返す。引数がないとエラーになる。同じ中身でも別のオブジェクトIDだとfalseになる。
a = "apple"
b = "apple"

p a.equal?(b) #=>false
はるはる

演算子クラス

色々

  • <=>:宇宙演算子。両辺の比較結果を1(>)・0(==)・-1(<)のどれかの数値で返す。
p 3 <=> 2   #=>1
p 5 <=> 5   #=>0
p -1 <=> 0  #=>-1
  • !=:値が等しくない。==の逆。

orの挙動について

m = true
m or n = true
p n  #=> nil

orを使うと、左辺がtrueの時は右辺は実行しない。
しかし、変数nは静的に宣言されている。ただ中身の代入n = trueは実行されていないので、変数nの中身はnilになる。


演算子の優先順位とオーバーライドできるか

優先度 演算子 オーバーライド
高い :: ×
[]
! ~
**
* / %
+ -
<< >>
&
| ^
> >= < <=
<=> == === != =~ !~
&& ×
|| ×
.. ... ×
? : ×
= += -= ×
not ×
低い and or ×
はるはる

論理積・論理和・&|

  • a && b:aとbが両方trueの場合はbをそのまま返す。aがfalseの場合はbは実行されない。
a = [1, 2, 3]
b = [2, 3, 4]

p a && b #=>[2, 3, 4]
  • a & b:aとbの論理積を返す。
a = [1, 2, 3]
b = [2, 3, 4]

p a & b #=>[2, 3]

  • a || b:aとbが両方trueの場合はaをそのまま返す。aがfalseの場合はbを評価し、bがtrueであればtrueを返す。
a = [1, 2, 3]
b = [2, 3, 4]

p a || b #=>[1, 2, 3]
a = (1 == 2)
b = (1 == 1)

p a || b #=>true
  • a | b:aとbの論理和を返す。
a = [1, 2, 3]
b = [2, 3, 4]

p a | b #=>[1, 2, 3, 4]

はるはる

puts・p・printの違い

  • puts:配列は要素ごとに改行する。ターミナル実行時の戻り値はnil
  • print:別々の行のprintの実行も全て改行なしで出力される。
print 123
print "abc"

#=> 123abc
  • p:配列は要素ごとに改行しない。ターミナル実行時の戻り値はnil
    文字列は""ダブルクォートがついた状態で出力される。
    エスケープ文字(バックスラッシュ付きの正規表現)も変換されずそのまま出力される。
    そのため、デバッグに使用される。
はるはる

変数・定数

変数・定数とスコープ

  • ローカル変数:アルファベット小文字または_(アンダーバー)で始まる1文字以上のもの。変数名に$などの記号は使えない。
    スコープ:クラス、モジュール、メソッドの壁を越えられない。
  • インスタンス変数:@で始まるもの。
    スコープ:継承で共有されない。インスタンス内で完結。
  • クラス変数:@@で始まるもの。
    スコープ:定義したクラスと、そのクラスを継承したメソッド内で参照・代入可能。クラス変数を持つ同じクラスから生成した別々のインスタンス内で、クラス変数に代入されている値は共有されている。
  • グローバル変数:$で始まるもの。
    スコープ:プログラムのどこからでも参照できる。初期化(定義)していないグローバル変数を参照するとnilが返る。
  • 定数:アルファベット大文字で始まる1文字以上のもの。

定数の再代入

Rubyでは定数の再代入時には、警告メッセージ(warning)は表示されるが、変更やオーバーライドは可能

はるはる

Encordingクラス

  • ソースコードの文字コードを設定するマジックコメントの書き方
    # cording: エンコーディング名
  • マジックコメントとは、ソースファイルの文字コードを指定するためのもの。Ruby2.0以降なら デフォルトでUFT-8 なので指定不要。
  • UFT-8とは、「文字列符号化方式」のひとつ。「コンピュータが使う、文字に割り当てた番号と、実際のコンピュータが扱う数字の対応表」のひとつ。
はるはる

埋め込み(文字列リテラル)

a = "Ruby"
p "#{a}を学習する"
#=> "Rubyを学習する"
  • 埋め込みの省略記法
    @インスタンス変数$グローバル変数は下記のような省略した書き方ができる。
@a = "Ruby"
$b = "PHP"
p "#@a と #$b を学習する"
#=> "Ruby と PHP を学習する"
はるはる

破壊的なメソッド

基本的には!が付いていないメソッドは非破壊だけど、!が付いていなくても最初から破壊的なメソッドもある。よく出てくる5つを下記にまとめる。

  • shift:配列の先頭の要素を取り除いてそれを返す。
  • pop:配列の末尾の要素を取り除いてそれを返す。
  • unshiftprepend:引数を与えて使うメソッド。引数で渡すものを配列の先頭に挿入
    引数が2つ以上ある場合は引数の最後から順番に追加される。(引数の並び順通り先頭にくっつくイメージ)
  • pushappend:引数を与えて使うメソッド。引数で渡すものを配列の末尾に挿入
  • concat:破壊的に文字列同士や配列同士を連結させるメソッド。
はるはる

Stringクラス 空白文字など取り除く系メソッド

  • strip:文字列の先頭と末尾両方の空白・改行コードなど(\t\r\n\f\v)を取り除く。
    lstrip:文字列の先頭の空白・改行コードなどを取り除く。
    rstrip:文字列の末尾の空白・改行コードなどを取り除く。
  • chomp:文字列の末尾から改行コード(\r\n を取り除く。rstripとの違いは、改行だけを安全に切り取りたい時に使う。(stripだと取り除けるものが多いため)
  • chop:文字列の末尾から文字(文字なんでも)を1つ取り除く。ただし、末尾の文字が改行コード(\r\n)であればその2文字とも取り除く。
  • gsub("a", "b"):文字列中(先頭・末尾でなく間も含む)の、引数aにマッチしたものを全て引数bに置き換える。引数aに空白、引数bに空文字列を指定すると、文字列の間の空白も全て取り除ける。引数aには正規表現も指定できる。
a = "こ ん に   ち は"
p a.gsub(" ", "")
#=> "こんにちは"
  • delete:文字列中(先頭・末尾でなく間も含む)の、引数にマッチしたものを全て取り除く。
a = "こんにちは"
p a.delete("に")
#=> "こんちは"
はるはる

ループ処理まとめ

配列やハッシュ内で繰り返す系

  • for:指定した配列の要素に順番に実行したり、指定した範囲分繰り返しを行う。
    do省略可

    for i in [1, 2, 3] do
      print i * 2
    end
    #=> 246
    
    for i in 1..5 do
      print i
    end
    #=> 12345
    

  • each:配列の各要素に対してブロックを評価する。ハッシュにも使用できる。
    ※ブロックを渡した時はdoがない
    [1, 2, 3].each do |i|
      print i
    end
    #=> 123
    
    {a: 1, b: 2}.each {|a| print a}
    #=> [:a, 1][:b, 2]
    

ループ終了の条件を指定する系

  • while:指定した条件式が真である間(偽になるまで)ループする。
    do省略可
    ary = [1, 2, 3, 4, 5, 6, 7]
    i = 0
    while i < 5 do
      print ary[i]
      i += 1
    end
    #=> 12345
    

  • untilwhile not:指定した条件式が偽である間(真になるまで)ループする。whileの逆。
    do省略可
  • loopbreakでループを終了させない限りループし続ける。
    a = 0
    loop do
      print a
      a += 1
      if a >= 7
        break
       end
    end
    #=> 0123456
    

ループ回数を指定する系

  • times:指定した回数だけ繰り返す。指定が正の整数でない場合は何もしない
    3.times {print "Hello"}
    #=> HelloHelloHello
    

  • upto指定した数値からMAXの数値まで1ずつ増やしながら繰り返す。指定は整数(負の数もOK)で行う。
    5.upto(10) {|i| print i}
    #=> 5678910
    

  • downto指定した数値からMINの数値まで1ずつ減らしながら繰り返す。指定は整数(負の数もOK)で行う。
    0.downto(-5) {|i| print i}
    #=> 0-1-2-3-4-5
    
    3.downto(1) do |i|
      print i
    end
    #=> 321
    

  • step指定した数値から指定した上限・下限まで指定した数ずつ増やし / 減らしながら繰り返す。
    上下限に負の数が指定された場合は、下限として解釈される。
    スタートの指定値には少数や負の数も指定できる。(uptodowntoの自由度高いバージョンっぽい)
    例)4.5からスタートし、1.5ずつ増やしながら、7.5まで繰り返す。
    4.5.step(7.5, 1.5) {|n| print n}
    #=> 4.56.07.5
    

その他

  • nextnextを使った時点でそれ以降の処理を飛ばして次のループに移る。
    例)2の時はnext以降のprint aが飛ばされて、2だけ出力されない。
    [1,2,3,4].each do |a|
      next if a == 2
      print a
    end
    #=> 134
    

  • redoredoを使うとループの初めから処理を繰り返す。

  • breakbreakを使った時点でループを抜け出すことができる。
はるはる

例外処理まとめ

記事を参照。
https://zenn.dev/lemonade_37/articles/ruby-exception-handling

オマケ

  • prime:任意の数までの 素数 を出力したい時に使用する。
require 'prime'
Prime.each(11) do |n|
  p n
end
出力
2
3
5
7
11
はるはる

to_◯まとめ

  • to_ss:string)・inspect文字列以外のオブジェクト文字列に変換するメソッド。
    他にも、10進数↔︎◯進数の変換に使用することもできる。(後述)
  • to_ii:integer):文字列を、10進数整数とみなして整数に変換するメソッド。
    整数とみなせないものに対してこのメソッドを使った場合は0を返す。
    他にも、◯進数↔︎10進数の変換に使用することもできる。(後述)
  • to_aa:array):オブジェクト配列に変換する。
    ハッシュ、範囲オブジェクトに使用することが多い。(文字列には使えない
    範囲オブジェクトを使うときは(1..5)のように括弧が必要。
  • to_ff:float):整数浮動小数点数に変換する。
    文字列が渡されると、それを10進数整数とみなして浮動小数点に変換する。
    整数とみなせないものに対してこのメソッドを使った場合は0.0を返す。
  • to_hh:hash):色々なクラスに同名のメソッドがあるが、よく使われるのはキーと値のペアになっている配列(内部の各配列が2つの要素を持っている配列)ハッシュに変換する。
    ハッシュに変換できない形式の配列を渡すとTypeErrorになる。
p [[1,2], [3,4], [5,6], [7,8]].to_h
#=> {1=>2, 3=>4, 5=>6, 7=>8}
  • to_symsym:symbol):文字列に対応するシンボルを返す。
p "hoge".to_sym
#=> :hoge
はるはる

◯進数の変換まとめ

to_iを使う方法

  • p '1010'.to_i(2):文字列を2進数とみなして10進数に変換する。例文の出力は=> 10
  • p '20'.to_i(5):文字列を5進数とみなして10進数に変換する。例文の出力は=> 10
  • p 'a'.to_i(16):文字列を16進数とみなして10進数に変換する。例文の出力は=> 10

to_sを使う方法

  • p 10.to_s(2):数値を10進数とみなして2進数に変換した文字列を出力。例文の出力は=> "1010"
  • p 10.to_s(8):数値を10進数とみなして8進数に変換した文字列を出力。例文の出力は=> "12"
  • p 10.to_s(16):数値を10進数とみなして16進数に変換した文字列を出力。例文の出力は=> "a"

oct・hexメソッド

  • oct🐙:文字列を8進数とみなし、10進数整数に変換する。to_i(8)と同じ。
    8進数で解釈できないものが渡された時は0を返す。
  • hex:文字列を16進数とみなし、10進数整数に変換する。to_i(16)と同じ。
    16進数で解釈できないものが渡された時は0を返す。

◯進数の前に付くもの

2進数:0b1011
8進数:0377、0o377
10進数:0d10
16進数:0xffff

はるはる

%記法まとめ

  • %%Qダブルクォート1つの文字列になる。
  • %qシングルクォート1つの文字列になる。

  • %W:それぞれの要素を文字列とする配列になる。
    %wとの違いは、大文字%Wの方は#{hoge}などの式の展開がされること。
p %W(a b c)
#=> ["a", "b", "c"]
  • %w%Wと同様だが、埋め込みの式展開がされない。

  • %I:それぞれの要素をシンボルとする配列になる。
    %iとの違いは、大文字%Iの方は#{hoge}などの式の展開がされること。
p %I(a b c)
#=> [:a, :b, :c]
  • %i%Iと同様だが、埋め込みの式展開がされない。
  • %s:引数がひとつの場合は、%iと同じ動きになる。空白で区切ると、下記のような動きになる。
    そのため基本的に%iを使用した方が良さそう。
p %s(abc)
#=> :abc

p %s(a b c)
#=> :"a b c"

  • %xコマンド出力を行う。バッククォートで囲った時と同様。
p `date`
#=> "Wed 14 Feb 2024 11:57:54 AM UTC\n"

p %x(date)
#=> "Wed 14 Feb 2024 11:57:54 AM UTC\n"
はるはる

三項演算子

三項演算子とは、if〜else文を簡潔に書くことができる記法。
条件式 ? 式A : 式Bは下記のif文と同じ。

if 条件式
  式A
elseB
end
はるはる

色々な引数まとめ

可変長引数

個数に制限を設けていない引数のこと。その引数は配列として認識される。
メソッドの引数に * をつけると可変長引数として扱われる。

def foo(*a)
  p a
end

foo(1, 2, 3)
#=> [1, 2, 3]

ブロック引数

メソッドの引数に & をつけると引数をProcオブジェクトとして受け取れるようになる。
また、繰り返し文で、あらかじめ定義しておいたProcオブジェクト(ブロック)を引数に渡すなどでも使われる。
(Procについては後述)

# hogeというProcオブジェクトがある時
def method(&hoge)
  hoge.call
end

キーワード引数

メソッドの引数に ** をつけると引数のハッシュを展開してキーワード引数として受け取れるようになる。

def greet(**human)
  p "私は#{human[:name]}です。#{human[:age]}歳です。"
end

greet(name: "花子", age: 25)
#=> "私は花子です。25歳です。"
はるはる

Procクラス

ブロックをオブジェクトとして扱うためのクラス。
そもそもブロックとは、each文などの引数としてよく使われる{|n| p n}などのコードの塊のこと。
Procオブジェクトを作ることで、ブロックを変数に保存したり、メソッドに渡したりすることができるようになる。
名前の無いメソッドのようなもの。(Ruby以外の言語ではこのような処理を無名関数と呼ぶことがある)

proc = Proc.new {|a, b| a + b}
p proc.call(3, 4)
#=> 7

Procに関するメソッド

<クラスメソッド>

  • newProc.newでProcオブジェクトを作れる。

<インスタンスメソッド>

  • call:Procオブジェクトを実行するためのメソッド。
    Procオブジェクトに対して使うことでそのブロックの中身を呼び出せる。
    引数を渡すことで、その引数を呼び出したブロックで実行できる。
  • arity:Procオブジェクトが必要とする引数の数を返すメソッド。
  • curry:引数を部分適応するためのメソッド。複数の引数を取るProcオブジェクトに対して、一部の引数だけを先に渡して、残りの引数を後から渡すことができる。
  • procProc.newとほぼ同じ動きをする。引数にブロックを渡すと、そのブロックをProcオブジェクトに変換する。
  • to_procSymbol#to_procメソッドのこと。オブジェクトをProcオブジェクトに変換するためのメソッド。特に、シンボルや目どっそオブジェクトをブロックとして渡す時に便利。
はるはる

Mathモジュール

使用するときは、 include Mathと書くか、Mathモジュールの使いたい定数の前にMath::〇〇と書く。Mathメソッドの場合は、Math.〇〇のように.ドットでも可。

  • PIMath::PI):円周率
はるはる

特異メソッド

ある特定のオブジェクトに対してだけ定義されたメソッドのこと。
通常、クラス内に定義されたメソッドはそのクラスの全てのインスタンスで使えるが、
特異メソッドを使うと、ある特定のオブジェクトに対してのみ適応されるメソッドになる。

s = "Hello"
def s.greet
  puts "Hi!"
end

class String
  def greet
    puts "こんにちは"
  end
end

s.greet
#=> Hi!

# ひっかけの他の出力も確認
p s
#=> "Hello"

s = String.new
s.greet
#=> こんにちは
# sというインスタンスを作った後ならs.greetは「こんにちは」になる
はるはる

英語の文字列大文字↔︎小文字の変換メソッドまとめ

  1. downcase:全ての 大文字小文字 に置き換えた文字列を返す。
    p "STRing".downcase
    #=> "string"
    
  2. upcase:全ての 小文字大文字 に置き換えた文字列を返す。
    p "stRInG".upcase
    #=> "STRING"
    
  3. swapcase大文字を小文字に小文字を大文字に 置き換えた文字列を返す。
    p "stRInG".swapcase
    #=> "STriNg"
    
  4. capitalize:文字列の 先頭の文字を大文字に残りを小文字に 置き換えた文字列を返す。
    p "stRInG".capitalize
    #=> "String"
    
はるはる

ヒアドキュメント

Ruby 以外にもプログラミング言語で使われている。
長い文字列や複数行に渡る文字列を簡単に記述するための機能。

# <<EOS を <<-EOS とすると、最後の EOF がインデント付きでもエラーにならない。
message = <<EOS
これはヒアドキュメントです。
複数行にわたる長い文字列を
簡単に記載できます。
EOS
# 終了ラベルはどんな時でも識別子(EOF など)にクォーテーションなど何もつけない!

puts message

puts "---"

p message # p を使用すると改行が \n で表示される
出力
これはヒアドキュメントです。
複数行にわたる長い文字列を
簡単に記載できます。
---
"これはヒアドキュメントです。\n複数行にわたる長い文字列を\n簡単に記載できます。\n"
  • EOS:End Of String の略で、ヒアドキュメントの終わりを示すためによく使われるが、
    この識別子は、始まりと終わりで同じ文字ならなんでも良い。

開始ラベルの意味

  • "EOF":式展開が有効
  • EOF:式展開が有効
  • 'EOF':式展開できない
  • `EOF`:コマンド出力
はるはる

IOクラス

IO クラスとは、ファイル操作に関する入出力を扱うためのクラスで、プログラムの外部とデータをやり取りするための機能として入力(input)と出力(output)を提供する。

主なメソッド

  • io.seek:ファイル内の読み書き位置(ファイルポインタ)を移動するために使うメソッド。引数には移動先のバイト位置を指定する。
    File.open('example.txt', 'r') do |file|
      file.seek(10) # 10バイト目の位置に移動
      puts file.read(5) # そこから5バイト読み込む
    end
    
  • io.eof?:ファイルの終わり(EOF:End Of File)に達しているかどうかを確認するメソッド。達していれば true 、達していなければ false を返す。
    File.open('example.txt', 'r') do |file|
      puts file.eof? # ファイルの最初は終わりに達していないので false が出力される
      puts file.read # ファイルを最後まで読み込む
      puts file.eof? # ファイルの最初は終わりに達しているので true が出力される
    end
    
  • io.read:ファイルの内容を まるごと1つの文字列として 読み込むために使うメソッド。引数を指定しない場合は、ファイルの 残り全体 を読み込む。読み込み後のファイルポインタはファイル終端に移動している。
    引数でバイト数を指定すると、そのバイト数だけ読み込む。
    File.open('example.txt', 'r') do |file|
      puts file.read(10) # 最初の10バイトを読み込む
      puts file.read # 残りの内容を全て読み込む
    end
    
  • io.readlines:ファイルの残り全体を読み込んで、行ごとに分割して配列で 返すメソッド。残りの行が何もない時は 空配列 を返す。
  • io.write:ファイルに文字列を書き込む。
  • io.close:入出力ポートをクローズする。

バイト位置(ファイルポインタ)

考え方

位置の指定

  • IO::SEEK_SET:ファイルの先頭からの位置
  • IO::SEEK_CUR:現在のファイルのポインタの位置
  • IO::SEEK_END:ファイルの末尾
はるはる

Fileクラス

よく使われるメソッド

  • File.open:ファイルを開く。実行時に自動的にファイルを閉じてくれる。
  • File.read:ファイルの内容を読み込み、内容を文字列として返す。
  • File.write:ファイルに文字列を書き込む。第1引数にファイル名、第2引数に書き込む文字列。
  • File.exist?:ファイルが存在するか確認し、あれば true を返す。
  • File.dirname:ファイルのディレクトリ(dir)名を取得する。
  • File.extname:ファイルの拡張子(ext)を取得する。
  • File.delete:ファイルを削除する。削除したファイルの数を返す。
  • File.chmod:ファイルのモードを引数で指定したモードに変更する。
  • File.size:ファイルのサイズを返す。

モード

記号 モード
r 読み込みモード
r+ 読み込み + 書き込みモード
w 新規作成・書き込みモード
w+ 新規作成(元ファイルの内容を空にして先頭から上書き)・読み込み + 書き込みモード
a 追記書き込みモード
a+ 読み込み + 追記書き込みモード
はるはる

Dirクラス

ディレクトリを操作するためのクラス。

よく使われるメソッド

  • Dir.glob:パターンにマッチするディレクトリやファイルの一覧を取得する。
  • Dir.mkdir:新しいディレクトリを作成する。
  • Dir.pwd:現在のワーキングディレクトリのパスを取得する。
  • Dir.chdir:ワーキングディレクトリを変更する。
  • Dir.entries:指定したディレクトリ内の全エントリ(ファイルやサブディレクトリ)の配列を取得する。
  • Dir.home:現在のユーザーまたは指定されたユーザーのホームディレクトリを返す。
  • Dir.open:ディレクトリをオープンして返す。
  • Dir.rmdir:ディレクトリを削除する。
  • Dir.delete空の ディレクトリを削除する。(空でないと削除できない)
はるはる

ぼっち演算子

&.

レシーバ&.メソッド という形で使う。
レシーバが nil の時、メソッドによってはエラーを起こすことも多いが、
これを使うとレシーバが nil の時、エラーを起こさずに nil を返す。

はるはる

同じ動きをする別名のメソッド

map, collect

  • map
  • collect

配列の要素の数だけ ブロック内の処理を繰り返して、新しい配列 を返す。
両方とも 破壊的なメソッドも存在する。

arr = [1, 2, 3]
p arr.map{ |n| n * 2 }
#=> [2, 4, 6]

p arr
#=> [1, 2, 3]
# 破壊的でなければ変化しない

size, length

  • size
  • length

配列やハッシュの 長さ(要素数) を返す。
文字列に対して使用すると 文字数 を返す。

arr = [1, 2, 3, nil]
p arr.size
#=> 4

delete_if, reject!

  • delete_if
  • reject!

ブロック内の 条件式が真になる要素全て削除 する。(破壊的に


detect, find

  • detect
  • find

要素に対して、ブロックを評価した値が真になった最初の要素 を返す。(見つけたら処理は終了)


update, merge!

  • update
  • merge!

Hash クラスのメソッド。
レシーバのハッシュに、引数のハッシュキーと値のペアを追加 する。
レシーバに同じキーが存在する場合は、引数のハッシュの値で上書きする。


find_all, select, filter

  • find_all
  • select
  • filter

ブロック内の 条件式が真になる要素 を全て含む 配列 を返す。

arr = [1, 2, 3, 4, 5, 6]
p arr.find_all{ |n| n.even? }
#=> [2, 4, 6]

p arr
#=> [1, 2, 3, 4, 5, 6]
# 破壊的でなければ変化しない
はるはる

特殊変数

  • $_gets() または readline() で最後に読み込んだ行
    ※ これらのメソッドは IO クラスのメソッド
  • $!raise された例外オブジェクト
  • $` :正規表現にマッチした箇所より、前の 文字列
  • $':正規表現にマッチした箇所より、後ろの 文字列
  • $~:正規表現にマッチした時の、MathData オブジェクト
  • $&:正規表現にマッチした 箇所の 文字列
  • $0:現在の Ruby スクリプト名。$PROGRAM_NAME と同じ。
はるはる

正規表現

正規表現とは、文字列とマッチングを行うためのパターン。
/ ... / で囲まれている部分は、Ruby の正規表現リテラル

マッチしているか判定

  • =~:マッチしたら 0 、しなければ nil を返す
  • ===
  • match メソッド

先頭の指定

  • /^a/a から始まる パターン

末尾の指定

  • /a$/a で終わる パターン

並列

[ ] で囲われた文字ならどれでもマッチする。
例) a[bc]dabdacd のいずれかにマッチする。

否定

[^] で囲われた文字 以外 ならどれでもマッチする。
例) a[^bc]dabdacd 以外の a●d ならマッチする。

組み込み変数

正規表現のマッチング結果に関連するもの。

  • $`マッチした部分より前 を取り出す
  • $&マッチした部分 を取り出す
  • $'マッチした部分より後ろ を取り出す

バックスラッシュ

  • \d:数字(10進数整数)とマッチ
  • \D:数字 以外 とマッチ
    _______________
  • \w:英数文字と _ とマッチ
  • \W:英数文字と _ 以外 とマッチ
    _______________
  • \s:空白文字とマッチ
  • \S:空白文字 以外 とマッチ

繰り返し

  • a+:直前の文字が 1回以上繰り返される時 にマッチ。a, aa, aaa など。連続するものはひとまとまりでマッチする。(scan メソッドの時など)

  • a*:直前の文字が 0回以上繰り返される時 にマッチ。空文字列でもマッチする。

    html.gsub(/<.*?>/, "")
    
    # 全てのHTMLタグを除去する。タグの中にどれだけ書いてあってもなくても、まとめて除去できる。
    # ドット . は改行以外の任意の1文字の意味。
    
  • a?:直前の文字が 0回か1回だけ出現する場合 にマッチ。

  • a{m}:直前の文字の m 回 の繰り返し。

  • a{m,}:直前の文字の 最低 m 回 の繰り返し。

  • a{m, n}:直前の文字の 最低 m 回、最高 n 回 の繰り返し。

正規表現の | (バーティカルバー)

「または」の意味で使われる。

pattern = /cat|dog/
p pattern =~ 'cat'     #=> 0 (マッチ)
p pattern =~ 'dog'     #=> 0 (マッチ)
p pattern =~ 'dogfood' #=> 0 (マッチ)
p pattern =~ 'bird'    #=> nil (マッチしない)

. (ドット)

改行以外の任意の1文字を表す。

メタ文字

正規表現で特別な意味を持つ記号を、その文字として認識させたい場合は、\(バックスラッシュ)を先頭につける。
例)\[[にマッチさせたい時。

はるはる

Arrayクラス

作成中です。

  • *:splat 演算子。単一のオブジェクトに対して使うと、そのオブジェクトを要素とする配列に変換する。ハッシュに対して使うと、展開して2次元配列にする。
    arr = *"a"
    p arr
    #=> ["a"]
    
はるはる

配列や文字列から取得する

作成中です。