ようへいの日々精進XP

よかろうもん

2018 年 05 月 07 日(月)

ジョギング

  • 香椎浜 x 2 周
  • 途中から大雨でイラッとした (イラッとするのはイカ

日課

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

ゴールデンウィーク明け

既に, 以下のような気分で始まった.

最終的に,

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

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

Q43. オブジェクト指向

以下のコードの実行結果として正しいものを選択する.

# コード
class Foo
  def foo
    "foo"
  end
end

class Bar < Foo
  def foo
    super + "bar"
  end
  alias bar foo
  undef foo
end
puts Bar.new.bar
  1. foobar

以下, irb による実行例 (一部抜粋).

...
irb(main):014:0> puts Bar.new.bar
foobar
=> nil

以下, 解説より抜粋.

  • alias はメソッドに別名をつけるためのキーワード
  • undef はメソッドを未定義化するためのキーワード
  • 問題文中のコードでは, foo メソッド定義後に undef されているが, alias として定義した bar は呼び出し可能な状態である為, foo メソッドが呼び出され, superによって問題なく親クラスの同名のメソッドが呼ばれている

以下, ドキュメントより引用.

  • alias

メソッドあるいはグローバル変数に別名をつけます。メソッド名に は識別子そのものか リテラル/シンボル を指定します(obj.method のよ うな式を書くことはできません)。alias の引数はメソッド 呼び出し等の一切の評価は行われません。

  • undef

メソッドの定義を取り消します。メソッド名には識別子そのもの か リテラル/シンボル を指定します(obj.method のような式を書くことはできません)。 undef の引数はメソッド呼び出し等の一切の評価は行われません。

Q44. 定数

以下の結果を出力するコードとして __(1)__ にあてはまるものを選択する.

# コード
CONST = "message1"
class Foo
  CONST = "message2"
  def foo
    puts __(1)__
  end
end
Foo.new.foo

# 実行結果
message1
  1. ::CONST

以下, irb による実行例.

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

以下, 解説より抜粋.

  • 定数名の先頭の :: はトップレベルを表す
  • ::Const でトップレベルにある定数を参照することが出来る

Object クラスに定義された定数もトップレベルになる為, 同様に ::CONST でアクセスすることが出来る.

irb(main):001:0> class Object
irb(main):002:1>   CONST = "message1"
irb(main):003:1> end
=> "message1"
irb(main):004:0> 
irb(main):005:0* class Foo
irb(main):006:1>   CONST = "message2"
irb(main):007:1>   def foo
irb(main):008:2>     puts ::CONST
irb(main):009:2>   end
irb(main):010:1> end
=> :foo
irb(main):011:0> Foo.new.foo
message1
=> nil
irb(main

Q45. クラス変数

クラス変数の説明として正しいものを選択する.

3. クラス変数の変数名の先頭には「@@」を付ける必要がある

以下, irb による実行例.

irb(main):001:0> class Foo
irb(main):002:1>   @@v = 'aa'
irb(main):003:1>   def foo
irb(main):004:2>     puts @@v
irb(main):005:2>   end
irb(main):006:1> end
=> :foo
irb(main):007:0> Foo.new.foo
aa
=> nil
irb(main):008:0> class Bar < Foo
irb(main):009:1>   @@v = 'bb'
irb(main):010:1>   def bar
irb(main):011:2>     puts @@v
irb(main):012:2>   end
irb(main):013:1> end
=> :bar
irb(main):014:0> Bar.new.bar
bb
=> nil
irb(main):015:0> Foo.new.foo # スーパークラスのクラス変数が上書きされてしまい, 意図しない結果となる可能性がある
bb
=> nil

クラス変数は, クラス間 (親クラス (スーパークラス), 子クラス) で共有される為, 上記のように子クラスにおいて, スーパークラスのクラス変数を上書きすることが出来てしまう.

フムフム.