LoginSignup
2
1

More than 5 years have passed since last update.

7日目(2):Ruby認定試験による勉強

Last updated at Posted at 2019-03-14

今日の分は、何をやってるか、まったくわからないものが多かった。
あと、あと範囲オブジェクトと[]あたりがごちゃごちゃのままの様だ。

演算子のオーバーライド

参照:Ruby 2.6.0 リファレンスマニュアル > 演算子式

多くの言語:演算子は、言語の組み込み機能で、通常の関数やメソッドとは別。
Ruby の場合、これらの演算子の多くが、ただのメソッドとして定義。

再定義できる演算子

|  ^  &  <=>  ==  ===  =~  >   >=  <   <=   <<  >>
+  -  *  /    %   **   ~   +@  -@  []  []=  ` ! != !~

再定義不可の演算子

演算子の組合せである自己代入演算子は再定義できない。

=  ?:  ..  ...  not  &&  and  ||  or  ::

演算子の定義方法

引用:Ruby 2.6.0 リファレンスマニュアル > クラス/メソッドの定義;演算子式の定義
わからない。

# 二項演算子
def +(other)                # obj + other
def -(other)                # obj - other

# 単項プラス/マイナス
def +@                      # +obj
def -@                      # -obj

# 要素代入
def foo=(value)             # obj.foo = value

# [] と []=
def [](key)                 # obj[key]
def []=(key, value)         # obj[key] = value
def []=(key, key2, value)   # obj[key, key2] = value

# バッククォート記法
def `(arg)                  # `arg` または %x(arg)

メソッドのオーバーライドと比較演算子

##比較演算子と<<  :問題
class Employee
  attr_reader :id
  attr_accessor :name

  def initialize id, name
    @id = id
    @name = name
  end

  def to_s
    return "#{@id}:#{@name}"
  end
  #ここに代入する式を選択して下さい。
end

employees = []
employees << Employee.new("3","Tanaka")
employees << Employee.new("1","Suzuki")
employees << Employee.new("2","Sato")
employees.sort!
employees.each do |employee| puts employee end

# 実行結果
1:Suzuki
2:Sato
3:Tanaka

# 選択肢
# 1 (答え)
def <=> other
  return self.id <=> other.id
end

比較演算子<=>

1 2
a < b -1
a == b 0
a > b 1
比較不可 nil

<<とは(array)

参考:<< (Array) rubyレファレンス
<<<演算子(メソッド)は、左辺の配列(レシーバ)の末尾に右辺のオブジェクトを要素として加えます。

#例
animals = ["dog", "cat", "mouse"]
animals << "pig"
p animals
["dog", "cat", "mouse", "pig"]

&&と&とand、||と|とorの違い

#問題
a = [1,2,3,4]
b = [1,3,5,7]
#ここに代入する式を選択して下さい。
c = XXXX
c.each {|i| print i, " " }
#出力結果
1  3
#選択肢
1. a+b ,2. a-b  ,3. a & b  ,4. a && b ,  5. a | b , 6. a || b
#解答 3

解説

&&演算子は左辺の評価結果がfalseの場合は、右辺を評価せずに次の処理に進む
|| 演算子は、左辺の評価結果がtrue の場合は、右辺を評価せずに次の処理に進む
|演算子と&演算子は、左辺の評価結果に関係なく、右辺を評価する

範囲オブジェクト

#範囲オブジェクト等:問題
a = [1,2,3,4]
#ここに代入する式を選択して下さい。
a.each do |i|
  print i, " "
end
#実行結果
1 2 3

# 選択肢
1. a[0..3]  ,2. a[0..-2]  ,3. a[0...-2]  ,4. a[0...-3] ,
5. a[3,0]  , 6. a[0,3]    ,7. a[2,0]       ,8. a[0,2]
# 答えは2と6

範囲オブジェクト

マイナスまで使えるとは
何度も出てきてるので、端から端まで要参照

配列のメソッド:適切なものを選べ

#問題選択肢
1. find_allとselectは同じ動作をする。
2. mapとcollectは同じ動作をする。
3. findとselectは同じ動作をする。
4. firstは先頭要素を削除し、その要素を返す。
5. concatは非破壊的メソッドである。
6. concat!は破壊的メソッドである。
#解答
1と2

select と find_all

同じ動作を、条件に合う配列をそのまま出力

#select
[1, 2, 3, 4, 5].select{ |v| v % 2 == 1 }
=> [1, 3, 5]
#find_all
[1, 2, 3, 4, 5].find_all{ |v| v % 2 == 1 }
=> [1, 3, 5]

map と collect

同じ動作をし、条件にある配列をtrue or falseで出力

#map
[1, 2, 3, 4, 5].map{ |v| v % 2 == 1 }
=> [true, false, true, false, true]
#collect
[1, 2, 3, 4, 5].collect{ |v| v % 2 == 1 }
=> [true, false, true, false, true]

find

findは先頭要素だけ出力

#find
[1, 2, 3, 4, 5].find{ |v| v % 2 == 1 }
=> 1

破壊的メソッドconcat

concat!は定義されていない

val = [ "a", "b" ]
c=> ["a", "b"]
val.concat( ["c", "d"] ) #=> [ "a", "b", "c", "d" ]
=> ["a", "b", "c", "d"]l
puts val
a
b
c
d

最後、valの値が変化している所、、要注意

zip[array] :コード結果を選べ

a1=%w(a b)
a2=%w(x y)
a3=a1.zip(a2)
p a3.first

# 選択肢
1. "a"  ,2. ["a"]    ,3. ["a", "x"]  ,4. ["a", "b"]  ,5. 例外が発生する。
# 解答

%w( )

配列を作る。配列の要素はスペース区切りで指定する。
式の展開はされない。

zip array

参考

zipメソッドは、配列の要素を引数の配列other_arrayの要素と組み合わせ、配列の配列を作成して返します。行と列を入れ替えるが、足りない要素はnilで埋められ、余分な要素は捨てられます。

arr1 = [1, 2, 3]
arr2 = [4, 5]
arr3 = [6, 7, 8, 9]
p arr1.zip(arr2, arr3)
[[1, 4, 6], [2, 5, 7], [3, nil, 8]]

slice() :実行結果をかけ

a = [1,2,3,4,5]
p a.slice(1,3)

#答え

slice()

要参照
sliceメソッドは、[]メソッドの別名です。配列から引数で指定した位置の要素を取り出して返す。

equal:実行結果を書け

a = "abc"
b = "abc"
print a.eql? b
print a.equal? b
print a == b

# 答え
true  false  true

eql?

ハッシュの内部で「同じキーかどうか」を調べるために使われるメソッド.
今回は、レシーバabcが引数abcと同じかどうか調べている

eqal?(object)

レシーバobjと引数other_objが同じオブジェクトならtrue、別のオブジェクトならfalseを返す。
objent絡みなので、変数名が違うと、falseを返すのだろう。。。?

型の取り扱い:エラーにならないものを選べ

1. puts 5 + "Hello"     ,2. puts "Hello" + 5
3. puts "Hello" * 5     ,4. puts 5 * "Hello"

# 答え

integerとstring

勘違いしていた
例えば、puts hoge + "ほげ"であっても、hogeが整数型の変数なら、hogeほげと返す

concatとchopとchomp:実行結果を書け

s1 = "Hoge"
s2 = "Fuga"
s1.concat(s2)
s1.chop
s1.chomp
s1 + s2
puts s1

# 答え

concat

破壊的メソッド。<< や pushに似ている

chop

文字列の末尾から1文字を取り除いた新しい文字列を返す。
"\r\n"で終わっている場合だけは、"\r\n"の2文字を取り除きます。

chomp

文字列の末尾の改行文字を取り除いた新しい文字列を返す。
改行文字は"\n"、"\r\n"、"\r"のどれでも取り除きます

今回の流れ

# irb
s1 = "Hoge"
s2 = "Fuga"

s1.concat(s2)
.c=> "HogeFuga"
# chopでs1末尾のeが取り除かれる
s1.chop
=> "HogeFug"
# s1に改行文字は含まれていない
s1.chomp  
=> "HogeFuga"
# 文字型同士の和は可能
s1 + s2
=> "HogeFugaFuga"
# concatの破壊的性質により、s1.concat(s2)の時点で、s1がHogeFugaに。
puts s1
HogeFuga

[]メソッド :実行結果を書け

s = "123456789"
p s[1,4]

# 解答
"2345"

解説

まず、範囲オブジェクトの類だと思っていた。
要参照:
slice()の別名

Hashクラス : 適切なものを選べ2つ

#選択肢
1, {}で空のHashオブジェクトを生成できる。
2, []で空のHashオブジェクトを生成できる。
3, invertでキーと値を入れ替えることができる。
4, keyに対応する値を取り出すメソッドとして、has_key?(key)、key?(key)、get_ key(key)などが用意されている。
5, すべての要素を削除するには、delete_allを使用する。

#答え
3と、2(答えを忘れた。後でまた調べる

Hashクラス

ハッシュオブジェクトの元になっているクラス

[]

[]メソッドは、配列から引数で指定した位置の要素を取り出して返します。引数には、整数(位置)、整数2つ(位置と数)、範囲を指定できます。

{}

Hash作成

invert

キーを値に、値をキーにしたハッシュを作成

key

has_key?メソッドは、ハッシュが引数keyと同じキーを持っていればtrue、なければfalseを返します。
key?メソッド、include?, member?メソッドは、has_key?の別名

delete_all

検索でdelete hashはヒットするが、delete_all hash はヒットしない

Hashクラス: 適切でないものを選べ

#選択肢
1, deleteはキーを指定してキーと値の組を削除する。
2, removeはキーと値の組を削除する。
3, fetchは与えられたキーに関連付けられた値を返す。
4, clearはハッシュの要素を全て削除する。

#答え  1と4

delete

ハッシュから引数keyと同じキーを探して、キーと値を削除。レシーバ自身を変更するメソッドです。

remove

検索でヒットしない。定義されてないかな。

fetch

ハッシュから引数で指定したキーの値を取り出して返します。[]メソッドと機能は同じ.
だが、キーが存在しないときの動作が異なる

clear

キーと値をすべて削除し、ハッシュを空にします。レシーバ自身を変更するメソッドです。

Hashクラス:実行結果をかけ

#{} の問題
v = {}
v.class
#出力答え Hash

Hashクラス:実行結果をかけ

#invert array : 問題
v = {:v1 => 1, :v2 => v}
v.invert
#出力答え {1=>:v1, nil=>:v2}

invertメソッド

既に上で記述済み

%等々:回答を選択しから選べ

member = [10, "Tanaka"]
print "ID:%2d Name:%s" #ここに代入する式を選択して下さい。  
member
# 実行結果
ID:10 Name:Tanaka
# 選択肢
1. ,   ,2. +
3. %    ,4. .format

#答え %

%dと%s,%

%dとは

数字を文字列にしている

#irb
sprintf("%d", 4);
=> "4"

# %2d 2桁の文字列を返す
sprintf("%2d", 4);
=> " 4"

# %02d 2桁の文字列を返す。桁数が足りない場合は、前に0を追加。
sprintf("%02d", 4);
=> "04"

% の役割

うまいこと、検索でヒットさせれない
が、実行結果からして、シングルクオートやダブルクオートのエスケープが不要になる。

%s

シンボル:を付ける。式の展開はされない。

Hashクラス:適切な選択肢を

#配列、シンボル 問題
h = #ここに代入する式を選択して下さい。
p h
#選択肢
1. {a:1,b:2,c:3}   、2. {a=1,b=2,c=3}
3. Hash[:a, 1, :b, 2, :c, 3]    、4. {:a1,:b2,:c3}
#実行結果
{ :a => 1, :b => 2, :c => 3 }

#答え 4

解説必要なし

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1