ようへいの日々精進XP

よかろうもん

2018 年 05 月 08 日(火)

ジョギング

日課

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

洗面所の鏡に映る自分を見て思った

夕飯

  • パスタを作る
  • だいぶんこなれてきた

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

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

Q46. Object#inspect

以下のコードを実行した結果から, __(1)__ にあてはまる正しいものを選択する.

# コード
class Person
  def initialize(name)
    @name = name
  end
  def __(1)__
    "My name is #{@name}"
  end
end
p Person.new("taro")

# 実行結果
My name is taro.
  1. inspect

以下, irb による実行例.

irb(main):001:0> class Person
irb(main):002:1>   def initialize(name)
irb(main):003:2>     @name = name
irb(main):004:2>   end
irb(main):005:1>   def inspect
irb(main):006:2>     "My name is #{@name}"
irb(main):007:2>   end
irb(main):008:1> end
=> :inspect
irb(main):009:0> p Person.new("taro")
My name is taro
=> My name is taro

以下, 解説より抜粋.

  • inspect メソッドは p メソッドでオブジェクトそのものを出力した際の文字列表現を指定するメソッド

inspect メソッド無しだと以下のような出力になる.

irb(main):001:0> class Person
irb(main):002:1>   def initialize(name)
irb(main):003:2>     @name = name
irb(main):004:2>   end
irb(main):005:1> end
=> :initialize
irb(main):006:0> p Person.new("taro")
#<Person:0x0055bc855363c0 @name="taro">
=> #<Person:0x0055bc855363c0 @name="taro">

ここに inspect メソッドをオープンクラスして足してあげる.

irb(main):007:0> class Person
irb(main):008:1>   def inspect
irb(main):009:2>     "------- #{@name}------"
irb(main):010:2>   end
irb(main):011:1> end
=> :inspect
irb(main):012:0> p Person.new("pika")
------- pika------
=> ------- pika------

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

  • inspect はオブジェクトを人間が読める形式に変換した文字列を返す
  • 組み込み関数 Kernel.#p は, このメソッドの結果を使用してオブジェクトを表示する
$ irb
irb(main):001:0> [ 1, 2, 3..4, 'five' ].inspect
=> "[1, 2, 3..4, \"five\"]"
irb(main):002:0> Time.new.inspect 
=> "2018-05-05 06:42:55 +0900"

Q47. FileTest モジュール

FileTestモジュールに存在しないメソッドを選択する.

  1. child?

以下, 解説より抜粋.

  • FileTest モジュールはファイルやディレクトリの検査を行う機能をまとめたモジュール

その他の選択肢について. (ドキュメントより抜粋)

メソッド名 機能
FileTest#file? ファイルが通常ファイルである時に true を返し, ファイルが存在しない場合, あるいはシステムコールに失敗した場合等に false を返す.
FileTest#directory? ファイルがディレクトリの時に true を返し, ファイルが存在しない場合, あるいはシステムコールに失敗した場合等に false を返す.
FileTest#socket? ファイルがソケットである時に true を返し, ファイルが存在しない場合, あるいはシステムコードに失敗した場合等に false を返す.

Q48. オブジェクト指向

下記のコードの説明として正しいものを選択する.

# コード
class Foo
  def initialize(obj)
    obj.foo
  end
  def foo
    puts "foofoofoo"
  end
end
class Bar
 def foo
   puts "barbarbar"
 end
end
Foo.new(Bar.new)

以下, irb による実行例.

irb(main):001:0> class Foo
irb(main):002:1>   def initialize(obj)
irb(main):003:2>     obj.foo
irb(main):004:2>   end
irb(main):005:1>   def foo
irb(main):006:2>     puts "foofoofoo"
irb(main):007:2>   end
irb(main):008:1> end
=> :foo
irb(main):009:0> class Bar
irb(main):010:1>  def foo
irb(main):011:2>    puts "barbarbar"
irb(main):012:2>  end
irb(main):013:1> end
=> :foo
irb(main):014:0> Foo.new(Bar.new)
barbarbar
=> #<Foo:0x0055b8e8e92720>

Foo クラスの引数として, オブジェクト化された Bar クラスが渡されており, initialize メソッド内で Bar クラスのインスタンスメソッド foo が呼ばれる状態になっている為, barbarbar が出力される.

以下のように実行しても同様の結果を得ることが出来る.

irb(main):015:0> Bar.new.foo
barbarbar
=> nil

フムフム.