🐡

RubySilver学習まとめ2

に公開

引き続きRubySIlverの学習を進めています。苦手な範囲をまとめていきます!💪

Rexで出た問題

a = [1, 2, 3, 5, 8]
b = [1, 3, 6, 7, 8]
c = false || true ? true && false ? a | b : a & b : b ;
p c

Rubyの演算子の優先順位

演算子 意味
&& 両方 true のときだけ true
|| どちらかが true なら true
? : 条件 ? 真のときの値 : 偽のときの値
重複をなくして、全部まとめる。
& 共通して含まれるものだけ残す。

かっこをつけて読みやすくすると

c = (false || true) ? ((true && false) ? (a | b) : (a & b)) : b
  1. false || true → true
  2. true && false → false

||(OR・論理和) の意味

「どちらかがOKならOK」
例:「傘を持ってる or 屋根がある」なら、雨でも濡れない

傘を持ってる 屋根がある 濡れない?(OR)
❌(false) ❌(false) ❌(false)
❌(false) ✅(true) ✅(true)
✅(true) ❌(false) ✅(true)
✅(true) ✅(true) ✅(true)

|| は、 1つでも true なら、全体は true

つまり、false || true は…

  • false → 傘はない
  • true → 屋根がある

⇒ 少なくとも1つが true → 濡れない → true


&&(AND・論理積) の意味

「両方そろって初めてOK」
例:「財布を持ってる and 現金が入ってる」なら買い物できる

財布がある お金がある 買い物できる?(AND)
❌(false) ❌(false) ❌(false)
❌(false) ✅(true) ❌(false)
✅(true) ❌(false) ❌(false)
✅(true) ✅(true) ✅(true)

両方が true のときだけ、結果も true になる。

つまり、 true && false は…

  • true → 財布はある
  • false → お金がない

⇒ 両方そろっていない → 買い物できない → false

問題に戻ると…

c = true ? false ? a | b : a & b : b

これもかっこをつけると…

c = true ? (false ? (a | b) : (a & b)) : b
  1. 一番外側の true ? ... : b を見ます
      → true なので、左側の (false ? ... : ...) を使います
  2. 次に false ? (a | b) : (a & b) を見ます
      → false なので、右側の (a & b) を使います

つまり…c = a & b

a = [1, 2, 3, 5, 8]
b = [1, 3, 6, 7, 8]
a & b  # => [1, 3, 8]

✅ 答え:[1, 3, 8]

ファイルの読み書き

モード 説明
'r' 読み込み専用。ファイルが存在しないとエラー。書き込み不可。
'r+' 読み書き可能。既存のファイルの内容を保持したまま、読み書きできる。
'w' 書き込み専用。ファイルが存在すると中身が消える。
'w+' 読み書き可能。ただしファイルを 最初に空にする(上書き)。
'a+' 読み書き可能。追記モード(内容の末尾に追加される)。

1問目

open('textfile.txt', XXXX) do |f|
  data = f.read.upcase
  f.rewind
  f.puts data
end

実行前の textfile.txt 内容

recode 1
recode 2
recode 3

実行後の textfile.txt 内容

RECODE 1
RECODE 2
RECODE 3

答え

正解: 'r+'
読み書き両用。内容を消さずに開いて、読み出したあと上書きも可能。

処理の流れ

  • ファイルをモードXXXXで開く
  • 内容をすべて読み込んで大文字化
  • f.rewindでファイルの先頭に戻る
  • f.puts dataで新しい内容を書き込む

2問目

File.open('testfile.txt', XXXX) do |f|
  f.write("recode 1\n")
  f.seek(0, IO::SEEK_SET)
  f.write("recode 2\n")
end

実行後の textfile.txt 内容

recode 1
recode 2

答え

正解:'w+'

  • write → OK(書き込み可能)
  • seek(0, IO::SEEK_SET) → OK(読み書き両方可能で、先頭に戻れる)
  • 既存内容は削除される → 指定の出力になる

非破壊的・破壊的

str = "Liberty Fish   \r\n"
str.strip      # "Liberty Fish"
p str          # "Liberty Fish   \r\n"
  • stripは非破壊的メソッド
  • str.strip は、strの両端の空白や改行を「削除した新しい文字列」を返すだけ。(削除したらこうなるというのを出力)
  • 元の変数strは一切変更されない

参考文献

Discussion