Open17

Ruby Silver

jinta shimosakajinta shimosaka

勉強時間

勉強開始日:6/2(日)
勉強時間:30時間くらいかな(7/5(金))

受験結果

受験日:7/6(土)
点数:76/100(合格点75点)

ギリギリ...😰

jinta shimosakajinta shimosaka

REX記録

REXとは、Ruby技術者認定試験の対策ができるサービス
(Githubアカウントでのログインが必要)
URL:https://rex.libertyfish.co.jp/

  • 6/2(日):36点😭
  • 6/3(月):60点🤔
  • 6/8(土):68点🙄
  • 6/16(日):70点😗
  • 6/16(日):84点😙
  • 6/19(水):74点😢(File, IOクラスについての理解が浅い)
  • 6/22(土):80点
  • 6/25(火):82点
  • 6/30(土):88点
jinta shimosakajinta shimosaka

ゲッターとセッター

そもそもゲッターとセッターとは

# ゲッター(読み取り専用メソッド)
class User
  def name
    @name
  end

  def initialize(name)
    @name = name
  end
end

user = User.new(name: "太郎")
puts user.name #=> "太郎"(ここでnameメソッドが使える)

# セッター(書き込み専用メソッド)
class User
  def name
    @name = name
  end

  def name=(name)
    @name = name
  end
end

user = User.new
user.name = "太郎"(ここでnameに対して値を書き込みができる)
puts user.name #=> "太郎"

attr_accessor

attr_accessorは、インスタンス変数の読み取り専用メソッド(ゲッター)と書き込み専用のメソッド(セッター)の両方を定義することができる。

class User
  attr_accessor :name
end

user = User.new
user.name = "太郎"
puts user.name #=> "太郎"

attr_reader

attr_renderは、インスタンス変数の読み取り専用メソッド(ゲッター)のみを定義できる。

class User
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

user = User.new(name: "太郎”)
user.name = "二郎" #=> undefined method `name=' for an instance of User (NoMethodError)
puts user.name #=> "太郎"

attr_writer

attr_writerは、インスタンス変数の書き込み専用メソッド(セッター)のみを定義できる。

class User
  attr_writer :name
end

user = User.new
user.name = "太郎"
puts user.name #=> undefined method `name' for an instance of User (NoMethodError)
jinta shimosakajinta shimosaka

eql?とequal?

eql?

eql?メソッドは、レシーバーと引数の同値性(同じ値か)を検証する。

"sring".eql?("string") #=> true
"string".eql?("other") #=> false
1.eql?(1) #=> true
1.eql?(2) #=> false
1.0.eql?(1.0) #=> true
1.eql?(1.0) => false
true.eql?(true) #=> true
true.eql?(false) #=> false
nil.eql?(nil) #=> true
:foo.eql?(:foo) #=> true
:foo.eql?(:bar) #=> false

equal?

equal?メソッドは、レシーバーと引数のオブジェクトが同じもの(自分自身か)、つまり同じobject_idかを検証する。

a = "string" #=> object_id: 166120
b = "string" #=> object_id: 172500
a.equal?(b) #=> false
1.equal?(1) #=> true
1.0.equal?(1.0) #=> true
true.equal?(true) #=> true
false.equal?(false) #=> true
nil.equal?(nil) #=> true
:foo.equal?(:foo) #=> true

参考記事
https://haruguchi-yuma.hatenablog.com/entry/2022/02/09/073024

jinta shimosakajinta shimosaka

n進数変換

oct

文字列を8進数で表現された整数であると解釈し、整数(10進数)に変換する。

p "10".oct  # => 8
p "010".oct # => 8
p "8".oct   # => 0

to_i

文字列を10進数表現された整数であると解釈して、整数(10進数)に変換する。

p " 10".to_i    # => 10
p "+10".to_i    # => 10
p "-10".to_i    # => -10
p "010".to_i    # => 10
p "-010".to_i   # => -10

引数に基数指定ができ、2~36進数表現へ変換できる。

p "01".to_i(2)    # => 1(2進数を10進数へ)
p "0b1".to_i(2)   # => 1
p "07".to_i(8)    # => 7(8進数を10進数へ)
p "0o7".to_i(8)   # => 7
p "1f".to_i(16)   # => 31(16進数を10進数へ)
p "0x1f".to_i(16) # => 31

p "0b10".to_i(0)  # => 2(0b(2進数))
p "0o10".to_i(0)  # => 8(0o(8進数))
p "010".to_i(0)   # => 8(0(8進数))
p "0d10".to_i(0)  # => 10(0d(10進数))
p "0x10".to_i(0)  # => 16(0x(16進数))

hex

文字列を16進数表現された整数であると解釈して、整数(10進数)に変換する。

p "10".hex    # => 16
p "ff".hex    # => 255
p "0x10".hex  # => 16
p "-0x10".hex # => -16
p "xyz".hex   # => 0
p "10z".hex   # => 16
p "1_0".hex   # => 16
p "".hex      # => 0
jinta shimosakajinta shimosaka

Arrayクラス

shift

配列の先頭の要素を取り除いて(破壊的)それを返す。

a = [0, 1, 2, 3, 4]
a.shift #=> 0
a #=> [1, 2, 3, 4]

unshift(prepend)

配列の先頭に要素を追加する。(破壊的)

a = [1, 2, 3, 4]
a.unshift(0)
a #=> [0, 1, 2, 3, 4]

pop

配列の末尾の要素を取り除いて(破壊的)それを返す。

a = [0, 1, 2, 3, 4]
a.pop #=> 4
a #=> [0, 1, 2, 3]

push(append)

配列の末尾に要素を追加する。(破壊的)

a = [0, 1, 2, 3]
a.push(4)
a #=> [0, 1, 2, 3, 4]
jinta shimosakajinta shimosaka

変数と定数

  • $が付く変数は、グローバル変数
  • @@が付く変数は、クラス変数
  • @が付く変数は、インスタンス変数
  • アルファベット小文字_で始まる変数は、変数数字が先頭は使えない)
  • アルファベット大文字で始まる変数は、定数
jinta shimosakajinta shimosaka

String

"%"

p "i = %d" % 10       # => "i = 10"
p "i = %x" % 10       # => "i = a"
p "i = %o" % 10       # => "i = 12"
p "i = %#d" % 10      # => "i = 10"
p "i = %#x" % 10      # => "i = 0xa"
p "i = %#o" % 10      # => "i = 012"
p "%d" % 10           # => "10"
p "%d,%o" % [10, 10]  # => "10,12"

delete

引数(*args)に含まれる文字を取り除いた文字列を生成して返す。
'1-3'は1から3を意味する。('a-c'はaからc)
^0-9のように先頭に^が付く場合は、0から9以外を意味する。(引数以外を取り除く)

"123456789".delete("2-6") #=> "1789"
"123456789".delete("^1-5") #=> "12345"
"abcdefg".delete("a-e") #=> "fg"
"abcdefg".delete("^a-c") #-> "abc"

空白、改行の削除

\t:水平タブ
\r:復帰(return)
\n:改行
\f:改ページ
\v:垂直タブ

strip

文字列の先頭と末尾の空白文字(\t, \r, \n, \f, \v)を取り除く。

s = "\nstring \r\n"
s.strip
p s  #=> "\nstring \r\n"

strip!

文字列の先頭と末尾の空白文字(\t, \r, \n, \f, \v)を破壊的に取り除く。

s = "\nstring \r\n"
s.strip!
p s  #=> "string"

chop(chop!は破壊的)

文字列の最後の文字を取り除いた新しい文字を生成して返す。ただ、"\r\n"であれば、2文字を取り除く。

p "string\r\n".chop #=> "string"
p "string \r\n".chop #=> "string "
p "string".chop #=> "strin"
s = "string \r\n"
s.chop
p s #=> "string\r\n"

chomp(chomp!は破壊的)

末尾から指定する改行コードを取り除いた文字列を返す。引数を指定しない場合は、すべての改行コードを取り除く。

p "foo\n".chomp # => "foo"
p "foo\n".chomp("\n") # => "foo"
p "foo\r\n".chomp("\r\n") # => "foo"
jinta shimosakajinta shimosaka

Time

strftime

時刻をformat文字列に従って文字列に変換した結果を返す。
%F:日付(%Y-%m-%d)
%x:日付(%m/%d/%y)
%Y:西暦4桁
%y:西暦の下2桁(00-99)
%m:月を表す数字(01-12)
%d:日(01-31)

Date.today.strftime("%F") #=> "2024-06-16"
Date.today.strftime("%x") #=> "06/16/24"
Date.today.strftime("%Y-%m-%d") #=> "2024-06-16"
Date.today.strftime("%y-%y-%d") #=> "24-06-16"
jinta shimosakajinta shimosaka

Proc

ブロックをコンテキスト(ローカル変数のスコープやスタックフレーム)と共にオブジェクト化できる。

new

procインスタンスを作成できる。

call

procオブジェクトを実行できる。

proc = Proc.new {|n| n * 2 }
proc.call(2) #=> 4
jinta shimosakajinta shimosaka

演算子

<=>(宇宙船演算子)

レシーバーが大きい:正数
レシーバーが小さい:負数
レシーバ側と等しい:0
レシーバー側と比較できない:nil

20 <=> 10   #   1
10 <=> 20   #  -1
20 <=> 20   #   0
20 <=> '20' # nil
jinta shimosakajinta shimosaka

IO

ブログラムの外部とデータのやり取りをするための機能として入出力(Input)(Output)を提供するクラス

IO.read

pathで指定したファイルを、offsetで指定した位置から、指定したバイトだけ読み込み、文字列を返す。

# text.txt
Ruby
Silver
Ruby
Gold

# IO.read
puts IO.read("text.txt", 3, offset = 1) #=> uby

参考記事

https://qiita.com/nk-ty/items/bd0a5295e540e27936b3

jinta shimosakajinta shimosaka

特異メソッド

単一のオブジェクトに特化したメソッドのこと。(クラスメソッドによく見る)

# クラスメソッド
class Test
  def self.foo
    'foo!!'
  end
end

p Test.foo #=> "foo!!"

# インスタンスに対しての特異メソッド
test1 = Test.new # => 先ほどのTestクラスをインスタンス化
def test1.bar
  'bar!!'
end

p test1.bar #=> "bar!!"
jinta shimosakajinta shimosaka

ヒアドキュメント(行指向文字列リテラル)

<<識別子(<<"識別子"):ダブルクオートで囲ったときと同じ挙動
<<'識別子':シングルクオートで囲ったときと同じ挙動。
<<~識別子:前後の空白が取り除かれる
<<-識別子:終端行の識別子をインデントできる

# <<識別子(<<"識別子")
number = 1
s = <<EOS
  識別子(EOS)の間に記述したものが
  ヒアドキュメントになる。
  式展開#{number}ができる。
EOS
p s #=> "  識別子(EOS)の間に記述したものが\n  ヒアドキュメントになる。\n  式展開1ができる。\n"

# <<'識別子'
number = 1
s = <<'EOS'
  識別子(EOS)の間に記述したものが
  ヒアドキュメントになる。
  式展開#{number}ができない
EOS
p s #=> "  識別子(EOS)の間に記述したものが\n  ヒアドキュメントになる。\n  式展開\#{number}ができない\n"

# <<~識別子
s = <<~EOS
  '~'を先頭につけたヒアドキュメントは、前後の空白がなくなるよ
EOS
p s #=> "'~'を先頭につけたヒアドキュメントは、前後の空白がなくなるよ\n"

#  <<-識別子
s = <<-EOS
  '-'を先頭につけたヒアドキュメントは、終端の識別子をインデントできるよ
  EOS
p s #=> "  '-'を先頭につけたヒアドキュメントは、終端の識別子をインデントできるよ\n"
jinta shimosakajinta shimosaka

Enumerable(モジュール)

Array, Hash, Range, Enumerator等のクラスでインクルードされています。
ただし、効率化のため、そのクラスでEnumerableと同名・同等の機能を再定義(オーバーライド)しているケースも少なくなく、特にArrayクラスでは同名のメソッドを再定義していることが多い。

each_cons

要素を重複ありで n 要素ずつに区切り、ブロックに渡して繰り返す。

(1..10).each_cons(3){|v| p v }
# => [1, 2, 3]
#    [2, 3, 4]
#    [3, 4, 5]
#    [4, 5, 6]
#    [5, 6, 7]
#    [6, 7, 8]
#    [7, 8, 9]
#    [8, 9, 10]

each_slice

n 要素ずつブロックに渡して繰り返す。

(1..10).each_slice(3) {|a| p a}
    # => [1, 2, 3]
    #    [4, 5, 6]
    #    [7, 8, 9]
    #    [10]

partition

各要素を、ブロックの条件を満たす要素と満たさない要素に分割する。

[1, 2, 3, 4, 5, 6, 7, 8, 9].partition(&:odd?)
#=> [[1, 3, 5, 7, 9], [2, 4, 6, 8]]