Day 2 ~ 13: Ruby 認定試験による勉強
- from Qiita:
ソースコードの文字コードをUS-ASCIIに設定のマジックコメント
1,2,4 は同義で、正解。3 は Python。
例外処理(begin rescue ensure end
Wikipedia
プログラムの上位の処理から呼び出されている下位の処理で継続不能、または継続すれば支障をきたす異常事態に陥ったとき、制御を呼び出し元の上位の処理に返し安全な状態になるよう回復処理をすること。
1 で例外が起きなかったら、表示結果は 1 且つ 3 の表示結果、起きた場合は 2 且つ 3 の表示結果となる。 例外処理コードとして、ensure が用いられないパターンもある。 その他、rescue のなかで retry を用い、begin が成功するまで繰り返す処理がる。(無限ループ注意)
定数と変数
下コードの実行結果は『10 と表示された後、警告が表示され 100 と表示される。』
Ruby において、アルファベット大文字から始まる識別子(ABC や Abc)は定数。 他言語では定数を再定義しようとすると、警告が出て、結果、再定義できない。 Ruby においては、警告が出たのち、そのままデータがオーバーライトされる。
可変長引数
*
を 1 個つけると、引数を複数指定でき、引数は配列として受け取られる。
*
を 2 個つけると、オプション引数となり、Hash として受け取られる。
範囲オブジェクトとeach
.to_i
文字列を 10 進数の表現と見なして整数に変換する
範囲オブジェクト
まず『数 A…数 B』に関して、これは A から B まで繰り返すの意。ただし、B は含まれない。 そのため、『1…5』は、1 から 4 までの 4 回分繰り返す。 一方で、『1..5』は 5 を含み、1 から 5 までの 5 回分繰り返す。 因みに、『1..5』『101..105』『2001..2005』だろうと 5 回分。
1 から 10 まで表示するコードを選べ
(1.10).each do |i| puts i end
(1..10).each do |i| puts i end
(1...10).each do |i| puts i end
(1....10).each do |i| puts i end
ans => 2
定義されているのは、点2つと点 3 つ。 2つは2から 10 以下、3 つは2から 10 未満
upto
upto メソッドは、変数に「対象オブジェクトが持つ数値」から「max」までを順に代入しながら、処理実行。 1 回繰り返すごとに 1 ずつ数値は増加する(ここでは1から3までの 3 回。『1..3』と同義)。 また、downto メソッドもあり、これは 1 回繰り返すごとに 1 ずつ数値が減少する。 times メソッドも参照すべし。
step
はじめに、stemno を『数値間隔』とするとわかりやすい。 対象オブジェクトを持つ数字から順に代入しながら、処理を実行。 1 回繰り返すごとに、stepno で指定した数値間隔ごとに、数値が増加する。
範囲オブジェクト、uptoメソッドまとめ
これは、下とも書ける
変数、定数いろいろ
- ローカル変数
- アルファベット小文字または`_‘で始まる識別子
- グローバル変数
- $で始まり、宣言が必要なく、プログラムのどこからでも参照できる
- 初期化されていないグローバル変数を参照した場合、値は nil
- インスタンス変数
- @で始まり、特定のオブジェクトに属する
- そのクラスまたはサブクラスのメソッドから参照できる
- 初期化されていないインスタンス変数を参照した場合、値は nil
- クラス変数
- @@で始まり、クラス定義のなかで定義される
- クラスの特異メソッド、インスタンスメソッドなどから参照/代入ができる
- 定数
- アルファベット大文字で始まる
- 他の言語では『定数』なので、再定義しようとしても、警告が出て、再定義できない
- Ruby では、再定義しようとすると、警告が出るが、再定義できてしまう
super
親クラスのメソッドを呼び出す
attr_accerssor(attr_readerとattr_writer)
- attr_accerssor はゲッターとセッターの機能があるアクセスメソッド
- インスタンス変数の値はクラス内からしか取得できない
- クラス外からインスタンス変数を取得更新するには、ゲッター、セッターが必要
- Progate の PHP の方なら説明がちゃんとあった
include (モジュール名, モジュール名, …)
クラスやモジュールに、他のモジュールをインクルードする。 引数にはモジュールを指定し、上の様に複数指定できる。
Math module
浮動小数点演算をサポートするモジュール。
これは便利。
演算子のオーバーライド
Ruby の場合、演算子の多くがただのメソッドとして定義。
再定義できる演算子
再定義不可の演算子
演算子の組合せである自己代入演算子は再定義できない。
演算子の定義方法
メソッドのオーバーライドと比較演算子
比較演算子 <=>
1 | 2 |
---|---|
a < b | -1 |
a == b | 0 |
a > b | 1 |
比較不可 | nil |
<<
とは
<<<
演算子(メソッド)は、左辺の配列(レシーバ)の末尾に右辺のオブジェクトを要素として加えます。
&& & and
と || | or
の違い
&&
演算子- 左辺の評価結果が false の場合は、右辺を評価せずに次の処理に進む
||
演算子- 左辺の評価結果が true の場合は、右辺を評価せずに次の処理に進む
|
演算子と&
演算子- 左辺の評価結果に関係なく、右辺を評価する
配列のメソッド
適切なものを選べ
select と find_all
同じ動作を、条件に合う配列をそのまま出力
map と collect
同じ動作をし、条件にある配列を true or false で出力
find
find
は先頭要素だけ出力
破壊的メソッドconcat
concat!
は定義されていない
zip[array]
コード結果を選べ
zipメソッドは、配列の要素を引数の配列other_arrayの要素と組み合わせ、配列の配列を作成して返す。行と列を入れ替えるが、足りない要素はnilで埋められ、余分な要素は捨てられます。
実行結果になるように、##AAA##に記述するコードを選んでください
行と列を入れ替える。足りない要素は nil を返す
%w()
配列を作る。配列の要素はスペース区切りで指定する。 式の展開はされない。
slice()
実行結果をかけ
slice メソッドは、[]メソッドの別名です。配列から引数で指定した位置の要素を取り出して返す。
equal
実行結果を書け
eql?
ハッシュの内部で「同じキーかどうか」を調べるために使われるメソッドで、今回はレシーバ abc が引数 abc と同じかどうか調べている
eqal?(object)
レシーバ obj と引数 other_obj が同じオブジェクトなら true、別のオブジェクトなら false を返す。 objent 絡みなので、変数名が違うと、false を返すのだろう?
型の取り扱い:エラーにならないものを選べ
select
- puts 5 + “Hello”
- puts “Hello” + 5
- puts “Hello” * 5
- puts 5 * “Hello”
integerとstring
勘違いしていた
例えば、puts hoge + "ほげ"
であっても、hoge が整数型の変数なら、hoge ほげと返す
concatとchopとchomp:実行結果を書け
concat
破壊的メソッド。<<
や push()
に似ている
chop
文字列の末尾から 1 文字を取り除いた新しい文字列を返す。
\r\n
で終わっている場合だけは、 \r\n
の 2 文字を取り除きます。
chomp
文字列の末尾の改行文字を取り除いた新しい文字列を返す。 改行文字は”\n”、“\r\n”、“\r”のどれでも取り除きます
[]メソッド
まず、範囲オブジェクトの類だと思っていた。
要参照: []
(Array)
slice()の別名
[]
[]
メソッドは、配列から引数で指定した位置の要素を取り出して返す。引数には、整数(位置)、整数 2 つ(位置と数)、範囲を指定できます。
{}
Hash 作成
invert
キーを値に、値をキーにしたハッシュを作成
%
等々
回答を選択しから選べ
key
has_key?メソッドは、ハッシュが引数 key と同じキーを持っていれば true、なければ false を返す。 key?メソッド、include?, member?メソッドは、has_key?の別名
delete_all
検索で delete hash はヒットするが、delete_all hash はヒットしない
Hashクラス
ハッシュオブジェクトの元になっているクラス
select uncorrect
- delete はキーを指定してキーと値の組を削除する
- remove はキーと値の組を削除する
- fetch は与えられたキーに関連付けられた値を返す
- clear はハッシュの要素をすべて削除する
ans => 1, 4
実行結果をかけ
実行結果をかけ
適切な選択肢を
select
{}
で空の Hash オブジェクトを生成できる[]
で空の Hash オブジェクトを生成できる- invert でキーと値を入れ替えることができる
- key に対応する値を取り出すメソッドとして、has_key?(key)、key?(key)、get_ key(key)などが用意されている
- すべての要素を削除するには、delete_all を使用する
=> ans 3と2(答えを忘れた。あとでまた調べる)
delete
ハッシュから引数 key と同じキーを探して、キーと値を削除。レシーバ自身を変更するメソッド
fetch
ハッシュから引数で指定したキーの値を取り出して返す。[]
メソッドと機能は同じ。だがキーが存在しないときの動作が異なる
clear
キーと値をすべて削除し、ハッシュを空にする。レシーバ自身を変更するメソッド
%d
と %s
, %
%d
数字を文字列にしている
%s
シンボル:をつける。式の展開はされない。
ioクラス
実行結果を
CPU が 6 割、メモリ6GB 食われてた。
EOFとは
End of File の略
ioクラスメソッド、SEEK_SET
ファイルポインタを whence の位置から offset だけ移動させます。 offset 位置への移動が成功すれば 0 を返す
ファイル上の文字にポインタなる住所のようで住所じゃないものがある。らしい 今回は、io.seek(0,I/O::SEEK_SET)でオフセットを 0 に指定しているため、 文字の読み込みが最初の a からすすまない(ずっと a が読み込まれる)らしい
strgtime
実行結果にあう、選択肢を選べ
strgtimeメソッド
strgtimeで代表的なもの
1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|
4桁の西暦 | 2桁の西暦 | 月 | 日 | 時刻 | 分 | 秒 |
%Y | %y | %m | %d | %H | %M | %S |
Rubyの予約語
予約語を選べ
予約語: すでに Ruby 側で定義されている言葉。自分で使おうとしても使えない。
to_s
実行結果をかけ
to_s
:整数型データを文字型に変換する
検証コード
Rubyの偽の値
例外処理: 適切な選択肢を
&&
演算子
&&演算子は左辺の評価結果が false の場合は、右辺を評価せずに次の処理に進む。 || 演算子は、左辺の評価結果が true の場合は、右辺を評価せずに次の処理に進む。 |演算子と&演算子は、左辺の評価結果に関係なく、右辺を評価する。
raise 例外
raise は例外を投げるので、それ以降の処理を飛ばす それを捕捉したい場合は、begin rescue end を使う
今回の場合、raise が実行されると puts(“succeeded!”)が実行されないのを、考慮
gsub
実行するとどうなる
gsub! :破壊的メソッド
アルファベット大文字で始まる識別子は定数は定数なので、新たに代入する際には警告が発生する。 しかし、gsub!は破壊的メソッドを呼び出しているだけなので、警告は発生せず、文字列は「piyo」に書き換わる。
例外
正しい記述を選べ
- begin によって例外を捕捉する際は、例外の可能性がある処理を begin から rescue の間に記述する
- 1 つの処理に対して複数の rescue は、指定できない
- 例外オブジェクトのメソッド stacktrace により、例外スタックを取得できる
- ensure は、必ず記述する必要がある
ans => 1
stacktraceとは
stack trace - 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
エラーが発生したときに表示される内容で、そのエラーが発生するまでの過程(どんな処理がどの順番で呼び出されたかの流れ)を、ざっくりと表示したもの
エラーコード
次のコードの ##AAA##
に ZeroDivisionError
が発生したときの処理を記述したい。適切なコードを選択
rescue ZeroDivisionError = ex
rescue ZeroDivisionError ex
rescue ZeroDivisionError -> ex
rescue ZeroDivisionError => ex
ans => 3
試してみて
参照: Ruby 例外について
?A
コード実行どうなる
=>
65とは
Unicode 上の A の番号的な
クラスの継承
クラスの継承は <
なお、Kernel はモジュールなので不可
module Kernel
すべてのクラスから参照できるメソッドを定義しているモジュール。 Object クラスはこのモジュールをインクルードしています。Object クラスのメソッドは実際にはこのモジュールで定義されています。
to_i(n)
to_i メソッドは、文字列を n 進数の表現と見なして整数に変換。文字列の先頭から 10 進数と見なせる部分を切り取って変換し、見なせる部分がなければ 0 を返す。
正規表現
\d
は 10 進数なので、10 進数から始まる部分を配列で返し(scan)、その要素の数 length を返してる
配列と範囲オブジェクト
範囲オブジェクトは文字列にも使える
&と&&、|と||
1 | 作用 |
---|---|
& | 日本語の”且つ”と同じ。 |
&& | 左辺が真なら、右辺を評価して、右辺を返す |
| | 日本語の”または”と同じ |
|| | 左辺が真なら、右辺を評価せずに、左辺を返す |
※パイプ=『|』。エスケープできなかった
破壊的メソッド delete_if = reject!
ブロックの戻り値が真になった要素を削除。なお、reject は非破壊的
enum.each_with_index {|item, idx| block }
繰り返しごとにブロック引数 item には各要素が入り、idx には 0,1,2 と番号が入る
array.each_index {|index| block }
『ほぼ』each_with_index と同じ。繰り返しごとにブロック引数には各要素のインデックス(位置)の整数が入ります。戻り値はレシーバ自身
hash.each_pair {|key, val| block }
each と同じ
hash.each_key {|key| block }
繰り返しごとにブロック引数 key にはキーが入る。
hash.each_value {|val| block }
繰り返しごとにブロック引数 val にはキーの値が入る。each_何たらが他にも結構あるので、見ておこう
破壊的メソッド: shift とunshift
shift メソッドは、配列の最初の要素を削除し、その要素を返す。レシーバ自身を変更するメソッドです。配列が空のときは nil を返す。
compact()
と uniq()
concat, compact, uniq のうち、破壊的メソッドは concat のみなので、結果、元の配列 a に影響を及ぼすのは concat のみ
concat()
破壊的メソッド
push()
や <<
と同じ
配列の末尾に引数を結合。感嘆符が無い破壊的メソッド
conpact 非破壊的
配列から nil を取り除いた、新しい配列を作成感嘆符がついた conpact!が破壊的。
uniq 非破壊的
配列から重複した要素を取り除いて、新しい配列を作成感嘆符が付くと破壊的に。
map
collect
%w
記法
配列を作る
transpose
zip と同様、行と列を入れ替える。要素が足りない場合、例外 IndexError を発生。
EOB
次のコードは正しく動きません。修正案を。
encoding
chop 非破壊的
文字列の末尾から 1 文字を取り除いた新しい文字列を返す。!が付くと、破壊的
chomp 非破壊的
文字列の末尾の改行文字を取り除いた新しい文字列を返す。! が付くと、破壊的
^
キャレット
名をキャレット、否定をする
13456-に該当『しない』ものを削除している
scan(string)
指定した正規表現のパターンとマッチする部分を文字列からすべて取り出し、配列にして返す。
大文字と小文字のアルファベットで構成される文字列を返している
invert(hash)
hash のキーと値を入れ替える
update と sort
update
sort
配列の要素をソートした新しい配列を返す。要素 1 と要素 2 の比較結果が-1 なら要素 1 が先、0 なら同じ、1 なら要素 2 が先となる。
ルート
次のコードは、ファイル test . txt を読み、文字を逆順に書き込む処理です。「##AAA##」に入る適切な記述を選びなさい。
組み込み関数 open の第 2 引数には、ファイルのオープン モードを指定する。
r
、w
、a
に+
をつけると、読み書き両用でオープンになるw+
を指定すると元ファイルの内容を空にするa+
を指定すると、追記モードとなり、 元のファイルを書き換えることができない
chr と ord は対義語的
コードポイントの話。n.chr は,n で登録されている文字を返す。string.ord は string のコードポイントを返す。メソッドの意味は覚えてるけど、もう『65 を見たら A』と覚えるしか。
securerandom Module
安全な乱数発生器のためのインタフェースを提供するモジュール
urlsafe_base64
ランダムで URL-safe な base64 文字列を生成して返す。