ようへいの日々精進XP

よかろうもん

2018 年 04 月 21 日(土)

ジョギング

  • 香椎浜 x 3 周
  • 暑かったけど, いい汗かけた

日課

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

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

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

Q1. オブジェクト指向

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

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

# 実行結果
bar
  1. foo

以下, irb による実行結果.

irb(main):020:0* class Foo
irb(main):021:1>   def bar(obj=nil)
irb(main):022:2>    foo
irb(main):023:2>   end
irb(main):024:1>   private
irb(main):025:1>   def foo
irb(main):026:2>     puts "foo"
irb(main):027:2>   end
irb(main):028:1> end
=> :foo
irb(main):029:0> Foo.new.bar(Foo.new)
foo
=> nil

以下, 解説より抜粋.

  • private 以降で定義されたメソッドはそのクラス, またはサブクラス内でのみ使用することが出来る
  • private メソッドを使用する時にはレシーバを指定することが出来ない

ちなみに, Foo クラスを継承してしまえば, 継承先からレシーバ付きで呼び出すことが出来る.

...
irb(main):036:0> class Bar < Foo
irb(main):037:1>   def baz
irb(main):038:2>     foo
irb(main):039:2>   end
irb(main):040:1> end
=> :baz
irb(main):041:0> Bar.new.baz
foo
=> nil

Q2. オブジェクト指向

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

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

# 実行結果
foo
  1. self

以下, 解説より抜粋.

  • クラス内で定義したメソッドは, そのクラスのインスタンスから呼び出すことが出来る
  • インスタンスメソッド内で self を使用すれば, メソッドを呼び出したオブジェクト自身を参照することが出来る

以下, irb による実行例.

irb(main):001:0> class Foo
irb(main):002:1>   def foo
irb(main):003:2>    self.bar
irb(main):004:2>  end
irb(main):005:1>  def bar
irb(main):006:2>    puts "bar"
irb(main):007:2>   end
irb(main):008:1> end
=> :bar
irb(main):009:0> Foo.new.foo
bar
=> nil

以下, プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで の "7.5 self キーワード" より抜粋.

  • selfインスタンス自身を表す (JavaC#this とほぼ同じもの)
  • メソッド内部, 他のメソッドを呼び出す際に暗黙的に self を付けて呼び出している

Q3. オブジェクト指向

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

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

# 実行結果
Hello World
  1. super

以下, 解説より抜粋.

  • 親クラスの同名メソッドを子クラスから呼び出す場合は super というキーワードを使用する

以下, irb による実行例.

irb(main):001:0> class Hello
irb(main):002:1>   def greet
irb(main):003:2>     "Hello "
irb(main):004:2>   end
irb(main):005:1> end
=> :greet
irb(main):006:0> class World < Hello
irb(main):007:1>   def greet
irb(main):008:2>     super + "World"
irb(main):009:2>   end
irb(main):010:1> end
=> :greet
irb(main):011:0> puts World.new.greet
Hello World
=> nil

フムフム.