Open26

Ruby Silverお勉強3

koji ozawakoji ozawa

8/31 1回目

koji ozawakoji ozawa

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に適切なコードを選べ。
ただし、空ファイルは作成済みである。

koji ozawakoji ozawa

苦手な問題

解説
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クラスのクラスメソッドではないものを選択してください。

koji ozawakoji ozawa

8/31 2回目

koji ozawakoji ozawa

解説
三項演算子と&, &&, |, ||演算子の問題です。
三項演算子とは複数行にわたる 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
koji ozawakoji ozawa

解説
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クラスのクラスメソッドを選択してください。

koji ozawakoji ozawa

よく間違える

解説
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クラスのクラスメソッドではないものを選択してください。

koji ozawakoji ozawa

9/2 1回目

解説
Array#-はselfから引数に含まれる要素を取り除きます。
引数にselfに含まれない要素がある場合は、無視されます。

問題では、a2にa1と同じ[2, 3]が含まれるので、[2, 3]を除く[1]が表示されます。

問題

koji ozawakoji ozawa

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

koji ozawakoji ozawa

問題読み間違い

問題
Dirクラスのクラスメソッドではないものを選択してください。

選択肢
Dir.directory?
選択肢
Dir.chmod
選択肢
Dir.chown
選択
選択肢
Dir.pwd

koji ozawakoji ozawa

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
koji ozawakoji ozawa

9/4 2回目

koji ozawakoji ozawa

解説
Rubyではメソッド内で定数を定義することができません。
複数回メソッドを呼び出した場合に、定数が不定となるため定義できません。
宣言された場合は、SyntaxErrorが発生します。

問題
以下のコードを実行するとどうなりますか

def hoge
x = 10
Y = x < 10 ? "C" : "D"
puts Y
end
hoge

koji ozawakoji ozawa

解説
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]]

koji ozawakoji ozawa

解説
splat演算子()でハッシュを展開することが出来ます。
ハッシュはネストされた配列で表現出来ますので、splat(
)演算子ではその配列に対して展開を行います。

hash = {a: 100, b: 200}
p hash.to_a # [[:a, 100], [:b, 200]]と表示されます。
この問題は、次のように表示されるのが答えです。

[:a, 100]
[:b, 200]

koji ozawakoji ozawa

ちゃんと見ろよ

解説
Rubyの配列は0番からスタートします。
また、...は終端を含みません。
よって、3番目から4番目のcdが出力されます。

問題
次のコードを実行するとどうなりますか

str = "abcdefghijk"
p str[2...4]

koji ozawakoji ozawa

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?)

koji ozawakoji ozawa

9/9 2回目

ちゃんと見れば・・・

解説
*"a"はArrayクラスのオブジェクトを返します。

問題
次のコードを実行するとどうなりますか

hoge = *"a"
puts hoge.class
koji ozawakoji ozawa

9/9 3回目

ちゃんと見ていない

解説
Rangeクラスの...は終端を含みません。

問題
次のコードを実行するとどうなりますか

def hoge
x = 0
(1...5).each do |i|
x += 1
end
x
end
puts hoge

koji ozawakoji ozawa

9/9 4回目

よく間違える

解説
Array#&は論理積(AND)を求めることができます。
今回の問題では、[1, 2, 3]と[4, 2, 3]に双方に存在する[2, 3]が出力されます。

問題
次のコードを実行するとどうなりますか

a1 = [1,2,3]
a2 = [4,2,3]

p a1 & a2
koji ozawakoji ozawa

9/11 1回目

koji ozawakoji ozawa

解説
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"]
問題

koji ozawakoji ozawa

解説
以下のコードは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
問題

koji ozawakoji ozawa

解説
Rubyではメソッド内で定数を定義することができません。
複数回メソッドを呼び出した場合に、定数が不定となるため定義できません。
宣言された場合は、SyntaxErrorが発生します。

問題
以下のコードを実行するとどうなりますか

koji ozawakoji ozawa

9/11 2回目

解説
Rangeクラスの...は終端を含みません。

問題
次のコードを実行するとどうなりますか

def hoge
x = 0
(1...5).each do |i|
x += 1
end
x
end
puts hoge