Ruby Silver
勉強時間
勉強開始日:6/2(日)
勉強時間:30時間くらいかな(7/5(金))
受験結果
受験日:7/6(土)
点数:76/100(合格点75点)
ギリギリ...😰
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点
ゲッターとセッター
そもそもゲッターとセッターとは
# ゲッター(読み取り専用メソッド)
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)
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
参考記事
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
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]
変数と定数
-
$
が付く変数は、グローバル変数
-
@@
が付く変数は、クラス変数
-
@
が付く変数は、インスタンス変数
-
アルファベット小文字
と_
で始まる変数は、変数
(数字
が先頭は使えない) -
アルファベット大文字
で始まる変数は、定数
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"
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"
Proc
ブロックをコンテキスト(ローカル変数のスコープやスタックフレーム)と共にオブジェクト化できる。
new
procインスタンスを作成できる。
call
procオブジェクトを実行できる。
proc = Proc.new {|n| n * 2 }
proc.call(2) #=> 4
演算子
<=>(宇宙船演算子)
レシーバーが大きい:正数
レシーバーが小さい:負数
レシーバ側と等しい:0
レシーバー側と比較できない:nil
20 <=> 10 # 1
10 <=> 20 # -1
20 <=> 20 # 0
20 <=> '20' # nil
IO
ブログラムの外部とデータのやり取りをするための機能として入出力(Input)(Output)を提供するクラス
IO.read
pathで指定したファイルを、offsetで指定した位置から、指定したバイトだけ読み込み、文字列を返す。
# text.txt
Ruby
Silver
Ruby
Gold
# IO.read
puts IO.read("text.txt", 3, offset = 1) #=> uby
参考記事
Dir
ディレクトリ操作を行うためのクラス
特異メソッド
単一のオブジェクトに特化したメソッドのこと。(クラスメソッドによく見る)
# クラスメソッド
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!!"
ヒアドキュメント(行指向文字列リテラル)
<<識別子(<<"識別子"):ダブルクオートで囲ったときと同じ挙動
<<'識別子':シングルクオートで囲ったときと同じ挙動。
<<~識別子:前後の空白が取り除かれる
<<-識別子:終端行の識別子をインデントできる
# <<識別子(<<"識別子")
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"
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]]
#可変長引数
可変長引数は、1つしか定義できない。