ようへいの日々精進XP

よかろうもん

2018 年 05 月 03 日(木)

ジョギング

  • 三日月山 -> 立花山をトレランで縦走してみた
  • とても走り続けられるような状態ではなく, 途中でなんども歩いてしまった
  • 頂上から見下ろす景色は良かった

日課

  • (腕立て 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
  1. 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
  1. 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
  1. 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)
                      ^

フムフム.