パーフェクトRubyお勉強フェスティバル 第2章

oftonkingdom.hatenablog.com

パーフェクトRubyお勉強フェスティバル始めていきます.

このフェスティバルというのは私が勉強のやる気を保ち,自分で深く考えながら取り組むためのものです!よろしくお願いします!

といいつつ2-6以前の勉強のメモを残していないため,2-7から先の2章で気になったところをピックアップして公開します.

2-7 主な組み込みクラス

すべての値はオブジェクトとして扱われ、オブジェクトは何らかのクラスのインスタンスです。

どーん

2-7-2 文字列(String)

  • シングルクォートでくくると変数展開ができないが,ダブルクォートでくくると#{変数名} #{式}などと書けば中身を展開できる.Javaみたいに「+」でつなげて書かなくていいのは便利ですね.
  • 改行のない長い文字列を複数行に渡って書きたい場合,以下のように「\」により改行を無効化しなければならない…!
str = “ほんとは \
一行 \
なんですよ”

puts str # "ほんとは一行なんですよ"

逆に改行の入った複数行の文字列を表現するには<<識別子を用いたヒアドキュメントで以下のように記述する.

str = <<EOS
1行目だよ
2行目ですよ
EOS

puts str 
#1行目だよ
#2行目ですよ

こういう改行の扱いって,Rubyでは文の終わりに「;」がいらないかわりに改行によって文の区切りを判断しているため,“"で囲った文字の途中で改行すると文の終了と判断されておかしくなるってことだったりしますか…?

ここらへんはJavaとの違いなので気をつけなければならないですね.

2-7-3 シンボル(Symbol)

:Rubyのように先頭にコロン(:)をつけた文字の並びはシンボルリテラルです。

「シンボル」…自分が今まで勉強してきた言語では見なかった概念ですね.識別子やキーワードに用いるのによいらしい.

といっても今の時点だとどんな場面でシンボルを使ったらいいのかいまいちわからない.ので調べてみました.

qiita.com

文字列とは違ってシンボルは内部的には整数として扱われているみたいですね.なんでも処理速度の面で整数のほうがいいからということですね. ハッシュのキーなんかに使うといいとか…要するに識別さえできればいいってときに便利なんですかね.難しい.書いてるうちにわかってくるかもしれませんね.

2-7-4 配列(Array)

配列は複数のオブジェクトを順番に並べたコンテナオブジェクトです。1つの配列には異なる型のオブジェクトを入れることができます。

  • 要素の存在しない添字を指定すると「nil」が返る.「nil」って?(多分Rubyを勉強する人がみんな抱く疑問)また先のほうで出てくるのでそこで.
  • もちろん添字マイナス指定もできる!
  • 文字列の配列は「%w(文字列1 文字列2 …)」シンボルの配列は「%i(シンボル1 シンボル2 …) 」のように楽に書くことができる.いちいちクォートとか,カンマとか,書かなくていい!煩わしくないね!so cute!

2-7-5 ハッシュ(Hash)

  • 連想配列.添字(キー)にも任意のオブジェクトを使える.便利.他の言語で,キーに文字列しか使えなくてキーってなったことが何度かあります.ただし,主に先程の「シンボル」がキーに使われます.
  • {キー1 => 要素1, キー2 => 要素2, ...}のようなリテラルで,キーがシンボルのときは{キー1: 要素1, キー2: 要素2}でOK.
  • ハッシュの要素アクセス時にキーが存在しないときは「nil」が返る

2-7-6 範囲(Range)

  • これは前に少しrubyを書いてみていいなと思ったものです.
  • 境界について.「1..5」は末尾を含むが「1…5」は末尾を含まない.
  • Range#include? は値が自身に含まれるかどうかを真偽値で返す.
  • Range#each で繰り返し処理ができる.

2-7-7 正規表現Regexp

  • で,出たー正規表現.日常的に使わないので,調べてはまた忘れるを繰り返しちゃうやつ.→これから日常会話の中に正規表現を入れてみようか.
  • 正規表現リテラルは,「/pattern/」.リテラル内で式展開も可能.
  • パターンマッチを行うには,
pattern===‘なんか文字列’ #マッチするかを真偽値で返す
pattern=~’なんか文字列' #最初にマッチした位置を整数で返す

これは直感的でわかりやすいかも.pretty!

2-7-9 手続きオブジェクト(Proc)

  • 関数をオブジェクトとして表現したもの.Proc.newにブロックを渡すことで生成できる.呼び出すときは,Proc#callで.
#ofton手続きオブジェクトを生成する.
ofton = Proc.new {|time|
  puts "#{time}時だぞ起きなさい"
}

#oftonを実行する.
ofton.call 7 #7時だぞ起きなさい
  • 手続きをオブジェクトに.関数型っぽいことができるということか.

2-8 様々な代入式

2-8-1 多重代入

  • 一度に複数の変数や定数への代入を行うことができる.
a, b = 1, 2

とか.

a = ‘もしかして’
b = ‘俺たち’
a, b = b, a #入れ替わってるー??

で,一時変数に退避させなくてもswapとかできちゃう.

2-9 例外

begin
    #例外が発生する可能性がある処理
rescue 捕捉したい例外クラス
    #例外処理
end

2-12 組み込みの変数/定数

2-12-1 疑似変数

  • 疑似変数とは,参照専用の特殊な変数であり代入はできない.self,true,false,nilなど…
  • true,false,nilが「変数」なのはなんだか不思議な感じ.true,false,nilはそれぞれTrueClass,FalseClass,NilClassの唯一のインスタンスらしいが,どのタイミングでインスタンス化されているんだろう??というかインスタンス化という概念が存在しない?1つのプログラムで1つのインスタンスを共有している?と思ったらこの記事に知りたいことが書いてました.

qiita.com

まとめ

こういった技術系のことを初めて書いたのでいまいち勝手がわかっておりません. 全部拾って書くのはとても時間がかかってしまうのがわかったので,これからは特につまづいたところや覚えたいところを厳選して行きたいと思います.