ジョギング
- 三日月山 -> 立花山をトレランで縦走してみた
- とても走り続けられるような状態ではなく, 途中でなんども歩いてしまった
- 頂上から見下ろす景色は良かった
日課
- (腕立て x 50 + 腹筋 x 50) x 3
頭痛
- 引き続き, クビからの頭痛が続いてツライ
今日のるびぃ ~ Ruby技術者認定試験【Gold】模擬問題を解いてみる (re: 10) ~
もう何度か解いているけど, 再び, Ruby技術者認定試験【Gold】模擬問題 を 3 ~ 5 問くらいずつ解いていく.
Q31. オブジェクト指向
以下の結果を出力するコードとして __(1)__ に当てはまるものを選択する.
# コード module Mod __(1)__ def func puts "Hello Module" end end Mod.func # 実行結果 Hello Module
- module_function
以下, irb による実行例.
irb(main):001:0> module Mod irb(main):002:1> module_function irb(main):003:1> def func irb(main):004:2> puts "Hello Module" irb(main):005:2> end irb(main):006:1> end => :func irb(main):007:0> irb(main):008:0* Mod.func Hello Module => nil
以下, 解説より抜粋.
モジュール名.メソッド名
の形式で呼び出されるメソッドをモジュール関数と呼ぶ- モジュール関数を定義する場合, メソッドの前に
module_function
と記述する
以下, ドキュメントより抜粋.
module_function
はメソッドをモジュール関数にする- 引数で指定されたメソッドをモジュール関数にする, 引数無しの時には指定した後で定義されるメソッド全てをモジュール関数にする
- モジュール関数とは, プライベートメソッドであると同時にモジュールの特異メソッドであるようなメソッドである
- モジュール関数に別名を付ける場合には, 以下のように先に別名を定義する必要がある
irb(main):001:0> module M irb(main):002:1> def foo irb(main):003:2> p "foo" irb(main):004:2> end irb(main):005:1> irb(main):006:1* alias bar foo irb(main):007:1> module_function :foo, :bar irb(main):008:1> end => M irb(main):009:0> M.foo "foo" => "foo" irb(main):010:0> M.bar "foo" => "foo"
Q32. オブジェクト指向
以下のコードと説明として正しいものを選択する.
# コード obj = Object.new def obj.hello puts "hello" end obj.hello Object.new.hello
- 6 行目で例外が発生する
以下, irb による実行例.
irb(main):001:0> obj = Object.new => #<Object:0x0055b20afe8e60> irb(main):002:0> def obj.hello irb(main):003:1> puts "hello" irb(main):004:1> end => :hello irb(main):005:0> irb(main):006:0* obj.hello hello => nil irb(main):007:0> Object.new.hello NoMethodError: undefined method `hello' for #<Object:0x0055b20afa39c8>
以下, 解説より抜粋.
- Ruby では, 特定のオブジェクトにのみメソッドを定義することが出来る.
- これを特異メソッドと呼ぶ
- 特異メソッドは
オブジェクト名.メソッド
のように定義する - 6 行目はインスタンスメソッドを呼びだそうとしている為, NoMethodError の例外が発生する
Q33. デフォルト引数
以下の結果を出力するコードとして __(1)__ に当てはまるものを選択する.
# コード def foo(__(1)__) puts arg end foo # 実行結果 default
- arg = "default"
以下, irb による実行例.
irb(main):001:0> def foo(arg = "default") irb(main):002:1> puts arg irb(main):003:1> end => :foo irb(main):004:0> foo default => nil
以下, 解説より抜粋.
- メソッド定義時に引数にデフォルト値を指定することが出来る
- デフォルト値の指定は
引数名=デフォルト値
という形式で指定する - デフォルト値は固定値以外にも, 動的に変わる値や, 他のメソッドの戻り値を指定することも出来る
- デフォルト値有り, デフォルト値無しを混在することが可能
irb(main):001:0> def foo(arg1 = "default", arg2) irb(main):002:1> puts arg1 irb(main):003:1> puts arg2 irb(main):004:1> end => :foo irb(main):005:0> foo("aaa") default aaa => nil irb(main):006:0> def foo(arg1, arg2 = "dafault") irb(main):007:1> puts arg1 irb(main):008:1> puts arg2 irb(main):009:1> end => :foo irb(main):010:0> foo("aaa") aaa dafault => nil
可変長引数の場合, 可変長引数は 1 つしか定義出来ない, また, 固定引数の後に定義する必要があるので注意が必要.
irb(main):007:0> def foo(arg1, arg2, *arg3) irb(main):008:1> p arg1 irb(main):009:1> p arg2 irb(main):010:1> p arg3 irb(main):011:1> end => :foo irb(main):012:0> foo("a", "b", "c", "d", "e") "a" "b" ["c", "d", "e"] => ["c", "d", "e"] irb(main):001:0> def foo(*arg1, arg2, *arg3) irb(main):002:1> p arg1 irb(main):003:1> p arg2 irb(main):004:1> p arg3 irb(main):005:1> end SyntaxError: (irb):1: syntax error, unexpected * def foo(*arg1, arg2, *arg3) ^
フムフム.