ようへいの日々精進XP

よかろうもん

2018 年 02 月 24 日(土)

ジョギング

日課

  • (腕立て x 50 + 腹筋 x 30) x 3

夕飯

  • 奥さんが腕によりをかけていた
  • ポテトサラダがとても美味しかった

今日のるびぃ ~ Ruby技術者認定試験【Gold】模擬問題を解いてみる (1) ~

もう何度か解いているけど, Ruby技術者認定試験【Gold】模擬問題 を 3 ~ 5 問くらいずつ解いていく.

Q1. private メソッド

以下のコードの実行結果から __(1)__ に当てはまるものを選択してください.

# コード
class Foo
  def bar(obj=nil)
   __(1)__
  end
  private
  def foo
    puts "foo"
  end
end
Foo.new.bar(Foo.new)
 
# 実行結果
foo
  • 注目するのは private
  • private が指定している箇所以降のメソッドは private メソッドとなる
  • private はレシーバを付けた呼び出しが出来ないという特徴があるので, __(1)__ には foo が入る
[1] pry(main)> class Foo
[1] pry(main)*   def bar(obj=nil)  
[1] pry(main)*     foo    
[1] pry(main)*   end    
[1] pry(main)*   private  
[1] pry(main)*   def foo  
[1] pry(main)*     puts "foo"    
[1] pry(main)*   end    
[1] pry(main)* end  
=> :foo
[2] pry(main)> Foo.new.bar(Foo.new)
foo
=> nil

Q2. self キーワード

以下のコードの実行結果から __(1)__ に当てはまるものを選択してください.

# コード
class Foo
  def foo
   __(1)__.bar
 end
 def bar
   puts "bar"
  end
end
Foo.new.foo

# 実行結果
bar

インスタンスメソッド内で self キーワードを呼び出すことで, メソッドを呼び出したオブジェクト自身を呼び出すことが出来る.

[2] pry(main)> class Foo
[2] pry(main)*   def foo  
[2] pry(main)*     self.bar   
[2] pry(main)*   end   
[2] pry(main)*   def bar 
[2] pry(main)*     puts "bar"   
[2] pry(main)*   end    
[2] pry(main)* end  
=> :bar
[3] pry(main)> Foo.new.foo
bar
=> nil

Q3. super キーワード

以下のコードの実行結果から __(1)__ に当てはまるものを選択してください.

# コード
class Hello
  def greet
    "Hello "
  end
end
class World < Hello
  def greet
    __(1)__ + "World"
  end
end
puts World.new.greet

# 実行結果
Hello World

親クラスの同名クラスを子クラスから呼び出す場合には, super クラスを利用する.

[4] pry(main)> class Hello
[4] pry(main)*   def greet  
[4] pry(main)*     "Hello "    
[4] pry(main)*   end    
[4] pry(main)* end  
=> :greet
[5] pry(main)> class World < Hello
[5] pry(main)*   def greet  
[5] pry(main)*     super + "World"    
[5] pry(main)*   end    
[5] pry(main)* end  
=> :greet
[6] pry(main)> puts World.new.greet
Hello World
=> nil

Q4. 変数展開

以下のコードを実行した結果を選択してください.

a,  *b = *[1, 2, 3]
p a
p b
  • 配列の頭に * を付けると, 要素を展開することが出来る
  • 代入式の左辺の変数の先頭に * を指定すると複数の要素を配列に集約して受け取ることが出来る
[10] pry(main)> a, *b = *[1, 2, 3]
=> [1, 2, 3]
[11] pry(main)> p a
1
=> 1
[12] pry(main)> p b
[2, 3]
=> [2, 3]

Q5. 定数へのアクセス

以下のコードの実行結果から __(1)__ に当てはまるものを選択してください.

# コード
module M
  CONST = "HELLO"
end
puts __(1)__

# 実行結果
HELLO
  • 定数にアクセスする場合 :: を利用する
  • モジュールによって定数の名前空間が分かれているので モジュール::定数 でアクセス出来る
  • トップレベルより定数にアクセスする場合は ::モジュール::定数 でアクセス出来る
[1] pry(main)> module M
[1] pry(main)*   CONST = "HELLO"  
[1] pry(main)* end  
=> "HELLO"
[2] pry(main)> puts ::M::CONST
HELLO
=> nil

ふむふむ.