ジョギング
日課
- (腕立て x 50 + 腹筋 x 50) x 3
ゴールデンウィーク明け
既に, 以下のような気分で始まった.
https://t.co/dYLpjL1Rrd こういう気分。
— Yohei Kawahara(かっぱ) (@inokara) 2018年5月7日
最終的に,
テストが通って小さくガッツポーズ。
— Yohei Kawahara(かっぱ) (@inokara) 2018年5月7日
今日のるびぃ ~ 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
- 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
- ::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
以下, 解説より抜粋.
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
クラス変数は, クラス間 (親クラス (スーパークラス), 子クラス) で共有される為, 上記のように子クラスにおいて, スーパークラスのクラス変数を上書きすることが出来てしまう.
フムフム.