Ruby Silverお勉強3
8/31 1回目
aもいける複数回答忘れないように
解説
それぞれの実行結果と解説は以下のようになります。
w+
recode 2
w+は新規作成・読み込み + 書き込みモードで開きます。
既にファイルが存在する場合は、空になります。
IO#seekはファイルポインタを指定の位置に移動します。IO:SEEK_SETがファイルの先頭からの位置を指定する識別子です。
よって、recode 1を書き込み後にファイルの先頭にファイルポインタを移動し、recode 2で上書きしています。
w
recode 2
wは書き込みモードで開きます。
その他はw+と同様です。
a+
recode 1
recode 2
a+はファイルを読み込みモード + 追記書き込みモードで開きます。
ファイルの読み込みは、ファイルの先頭から行いますが、書き込みは、ファイルの末尾に行います。
a
recode 1
recode 2
aはファイルを追記書き込みモードで開きます。
ファイルの読み込みを行うことはできません。読み込みを行なった場合は、not opened for reading (IOError)が発生します。
問題
実行後の textfile.txt 内容になるようにXXXXに適切なコードを選べ。
ただし、空ファイルは作成済みである。
苦手な問題
解説
File.dirnameは引数に指定した文字列の一番後ろの/より前の文字列を返します。
/を含まない文字列の場合"."を返します。
File.dirname("text.txt") # => "."
File.dirname("REx/text.txt") # => "REx"
File.dirname("Desktop/REx/text.txt") # => "Desktop/REx"
File.closeメソッド, File.homeメソッド, File.pwdメソッドはFileクラスのクラスメソッドではありません。
問題
Fileクラスのクラスメソッドではないものを選択してください。
8/31 2回目
解説
三項演算子と&, &&, |, ||演算子の問題です。
三項演算子とは複数行にわたる if 文を一行で記述することができる文法です。
条件式 A ? 式 B : 式 C
条件式 A が真の時は式 B が実行され、偽の時は式 C が実行されます。
&と&&の違いについて
&は共通する要素を出力する
a = [1, 2, 3]
b = [1, 3, 5]
a & b #=> [1, 3]
&&は a と b がどちらも真のとき、最後に評価された b を出力する
a && b #=> [1, 3, 5]
a = nilの場合、右辺の処理は行われない
a && b #=> nil
|と||の違いについて
|は重複している要素をまとめて出力する
a = [1, 2, 3]
b = [1, 3, 5]
a | b #=> [1, 2, 3, 5]
||は a と b がどちらかが真のとき、最初に評価された a を出力する
a || b #=> [1, 2, 3]
a || b #=> [1, 3, 5]
問題
以下のコード実行後の正しい表示結果を選べ。
a = [1, 2, 3, 5, 8]
b = [1, 3, 6, 7, 8]
c = false || true ? true && false ? a | b : a & b : b ;
p c
解説
File.chmodメソッドは引数に指定したファイルのモードを変更します。
File.deleteメソッドは引数に指定したファイルを削除します。削除に成功した場合は削除したファイルの数を返し、削除に失敗した場合はエラーが発生します。
File.chmod(0644, "text.txt")
# => text.txtファイルのモードを「所有者は読み書き可能で実行不可能」「所有グループとその他は読み込みのみ可能で書き込みと実行は不可能」に変更
# 削除成功
File.delete("text_1.txt", "text2.txt") # => 2
# 削除失敗
File.delete("text_1.txt") # => Errno::ENOENT: No such file or directory @ unlink_internal - text_1.txt
File.pwdメソッドとFile.homeメソッドはFileクラスには存在しません。
問題
Fileクラスのクラスメソッドを選択してください。
よく間違える
解説
File.dirnameは引数に指定した文字列の一番後ろの/より前の文字列を返します。
/を含まない文字列の場合"."を返します。
File.dirname("text.txt") # => "."
File.dirname("REx/text.txt") # => "REx"
File.dirname("Desktop/REx/text.txt") # => "Desktop/REx"
File.closeメソッド, File.homeメソッド, File.pwdメソッドはFileクラスのクラスメソッドではありません。
問題
Fileクラスのクラスメソッドではないものを選択してください。
9/1 1回目 100点取り損ね ちゃんと問題読もう
9/2 1回目
解説
Array#-はselfから引数に含まれる要素を取り除きます。
引数にselfに含まれない要素がある場合は、無視されます。
問題では、a2にa1と同じ[2, 3]が含まれるので、[2, 3]を除く[1]が表示されます。
問題
9/3 1回目
解説
以下のコードはirbやpryではSyntaxErrorとなりますが、ファイルにコードを記述しスクリプトを実行する場合はSyntaxErrorにはなりません。
1: (1..10).each
2: .reverse_each
3: .each do |i|
4: puts i
5: end
以下のコードは1, 2行目の行末でバックスラッシュ()を記述することで、1行のコードとみなされます。
1: (1..10).each
2: .reverse_each
3: .each do |i|
4: puts i
5: end
問題
実行してもエラーにならないコードを選べ
選択
選択肢
(1..10).each
.reverse_each
.each do |i|
puts i
end
選択肢
(1..10).each.
reverse_each.
each do |i|
puts i
end
選択
選択肢
(1..10).each
.reverse_each
.each do |i|
puts i
end
選択肢
(1..10).to_a.each.
reverse_each.
each do |i|
puts i
end
問題読み間違い
問題
Dirクラスのクラスメソッドではないものを選択してください。
選択肢
Dir.directory?
選択肢
Dir.chmod
選択肢
Dir.chown
選択
選択肢
Dir.pwd
9/4 1回目
解説
Hash#new(default)は、空のHashを作成します。
default引数が指定された場合は、valueにdefaultが入ります。
defaultで作成された要素はpメソッドなどでHashの内容を参照する際は対象外になります。
問題
次のコードを実行するとどうなりますか
h = Hash.new("default value")
h[:a]
h[:b] = 100
p h
9/4 2回目
解説
Rubyではメソッド内で定数を定義することができません。
複数回メソッドを呼び出した場合に、定数が不定となるため定義できません。
宣言された場合は、SyntaxErrorが発生します。
問題
以下のコードを実行するとどうなりますか
def hoge
x = 10
Y = x < 10 ? "C" : "D"
puts Y
end
hoge
解説
productはレシーバーの配列と引数の配列からそれぞれ1つ要素を取り出し新しい配列を作成し、全ての配列を要素とする配列を返します。
productの例
[1, 2].product([3, 4])
実行結果
[[1, 3], [1, 4], [2, 3], [2, 4]]
transposeはレシーバーの配列から行と列を入れ替えた配列を作成し返します。
transposeの例
[[1, 3],
[1, 4],
[2, 3],
[2, 4]
].transpose
実行結果
[[1, 1, 2, 2], [3, 4, 3, 4]]
解説
splat演算子()でハッシュを展開することが出来ます。
ハッシュはネストされた配列で表現出来ますので、splat()演算子ではその配列に対して展開を行います。
hash = {a: 100, b: 200}
p hash.to_a # [[:a, 100], [:b, 200]]と表示されます。
この問題は、次のように表示されるのが答えです。
[:a, 100]
[:b, 200]
ちゃんと見ろよ
解説
Rubyの配列は0番からスタートします。
また、...は終端を含みません。
よって、3番目から4番目のcdが出力されます。
問題
次のコードを実行するとどうなりますか
str = "abcdefghijk"
p str[2...4]
9/9 1回目
解説
問題にあるプログラムを実行すると次のような結果が得られます。
ネストされた配列で1つめに奇数、2つめに偶数が格納されています。
p [1,2,3,4,5].partition(&:odd?)
[[1, 3, 5], [2, 4]]
&:<メソッド名>とするとSymbol#to_procが実行されます。
これはブロックを指定して奇数を判定することと同じことになります。
答えの選択肢は次のとおりです。
p [1,2,3,4,5].partition { |value| value.odd? }
問題
次のプログラムと同じ結果になる選択肢を選んでください。
p [1,2,3,4,5].partition(&:odd?)
9/9 2回目
ちゃんと見れば・・・
解説
*"a"はArrayクラスのオブジェクトを返します。
問題
次のコードを実行するとどうなりますか
hoge = *"a"
puts hoge.class
9/9 3回目
ちゃんと見ていない
解説
Rangeクラスの...は終端を含みません。
問題
次のコードを実行するとどうなりますか
def hoge
x = 0
(1...5).each do |i|
x += 1
end
x
end
puts hoge
9/9 4回目
よく間違える
解説
Array#&は論理積(AND)を求めることができます。
今回の問題では、[1, 2, 3]と[4, 2, 3]に双方に存在する[2, 3]が出力されます。
問題
次のコードを実行するとどうなりますか
a1 = [1,2,3]
a2 = [4,2,3]
p a1 & a2
9/11 1回目
解説
IO.writeメソッドは第1引数に指定したファイルを開き、第2引数に指定した文字列の書き込みを行った後ファイル閉じます。第3引数で書き込み開始位置を指定できます。
IO.readlinesメソッドは引数に指定したファイルの内容を全て読み込み、各行を要素に持つ配列を返します。
IO.write("readme.md", "Ruby\nExamination\n") # => ファイルreadme.mdに第2引数の文字列を書き込みファイルを閉じる
[readme.mdの内容]
Ruby
Examination
IO.readlines("readme.md") # => ["Ruby\n", "Examination\n"]
問題
解説
以下のコードはirbやpryではSyntaxErrorとなりますが、ファイルにコードを記述しスクリプトを実行する場合はSyntaxErrorにはなりません。
1: (1..10).each
2: .reverse_each
3: .each do |i|
4: puts i
5: end
以下のコードは1, 2行目の行末でバックスラッシュ()を記述することで、1行のコードとみなされます。
1: (1..10).each
2: .reverse_each
3: .each do |i|
4: puts i
5: end
問題
解説
Rubyではメソッド内で定数を定義することができません。
複数回メソッドを呼び出した場合に、定数が不定となるため定義できません。
宣言された場合は、SyntaxErrorが発生します。
問題
以下のコードを実行するとどうなりますか
9/11 2回目
解説
Rangeクラスの...は終端を含みません。
問題
次のコードを実行するとどうなりますか
def hoge
x = 0
(1...5).each do |i|
x += 1
end
x
end
puts hoge