Ruby認定試験対策問題

お知らせ

2007年11月27日

参加希望者が少ないため、Ruby認定試験の第二回に向けた勉強会は行わないことにしました。

総合的な問題を11問追加しました。合計で、20問公開してます。 ご活用ください。

総合問題 No.1

2007年11月21日

総合的な問題を9問を公開しました。 11月26日(月)までに、10問程度を追加する予定です。

総合問題 No.1

2007年10月26日

解答と解説を公開しました。ご覧ください。

回答と解説

2007年10月26日
第15回オープンソースサロンで, 問題のいくつかを解説しました。ご参加いただきありがとうございました。

はじめに

Ruby認定試験 の対策として、NaCl の有志で模擬試験問題を作成しました。

Ruby認定試験は次の日程で行われます。

作成した問題は以下の試験範囲から考えております。

http://www.school.ctc-g.co.jp/ruby/rubycertify.html

問題の作成にあたり、以下の文書を参考にいたしました。

これら問題が全く的外れだったとしても責任は持てません。 ご了承ください。

なお,現状では本文書の2次利用はご遠慮ください。 ご意見や間違いのご指摘などは、 <URL:mailto:ruby-test@qml.netlab.jp>へお願いします。

問題の改訂履歴はこちらです。

問題 [印刷用]

以下では、試験範囲の各項目にそったもの出題しています。 総合的な問題も作成しております。こちらもご活用ください。総合問題 No.1

1.実行環境

1.1.実行方法

  1. カレントディレクトリにtest.rbというファイル名で次のRubyのプログラム(Rubyスクリプト)がある。

    puts("Hello World")

    test.rbの実行方法として正しいものを選びなさい。

    ※Rubyインタプリタのファイル名はrubyとする。

    1. test.rb ruby
    2. ruby test.rb
    3. test.rb
    4. ruby - test.rb
  2. Rubyを対話形式で実行するツールとして、正しいものを選びなさい。
    1. ruby
    2. perl
    3. irb
    4. python
  3. 次のコマンドの実行結果として正しいものを選びなさい。

    ruby -e 'n = 10' -e 'n += 20' -e 'n += 30' -e 'puts(n)'
    1. 10
    2. 30
    3. 60
    4. nという変数は存在しないという例外(NameError)が発生する。

1.2.コマンドラインオプション

  1. 次の説明に該当するコマンドラインオプションを選びなさい。

    デバッグモードでスクリプトを実行します。$DEBUG を true にします。
    1. -W[level]
    2. -x[directory]
    3. -d, --debug
    4. -v, --verbose
  2. 次のコマンドラインオプションの説明として、正しいものを選びなさい。

    -r feature
    1. このフラグがセットされるとプログラム全体が sed -nやawk のように

      while gets
       ...
      end

      で囲まれているように動作します。

    2. スクリプト実行前に feature で指定されるライブラリを require します。 '-n'オプション、'-p'オプションとともに使う時に特に有効です。
    3. 引数で指定されたファイルの内容を置き換える(in-place edit)ことを指定し ます。元のファイルは拡張子をつけた形で保存されます。拡張子がなければ、バックアップは行われず、変更されたファイルだけが残ります。
    4. コマンドラインオプションの概要を表示します。
  3. 警告がオンになり、プログラムが標準入力から読み込まれ、そのプログラムの"Hello World"という文字列を引数として渡したい。この場合に正しいものを選びなさい。
    1. ruby -w - "Hello World"
    2. ruby -W0 - "Hello World"
    3. ruby -w "Hello World"
    4. ruby -T4 - "Hello World"
  4. 次の内容のtest.rbがカレントディレクトリにあるとする。

    puts(ARGV[0])

    次のコマンドを実行した場合の正しい出力を選びなさい。

    ruby test.rb "Hello" "World"
    1. test.rb
    2. Hello
    3. World
    4. test.rb Hello World

1.3.環境変数

  1. 環境変数を表すオブジェクトとして、正しいものを選びなさい。
    1. ARGV
    2. STDIN
    3. STDOUT
    4. ENV
  2. Rubyが使用する環境変数「RUBYLIB」の説明として正しいものを選びなさい。
    1. Rubyインタプリタにデフォルトで渡すオプションを指定します。
    2. Rubyライブラリの探索パス$:のデフォルト値の前にこの環境変数の値を付け 足します。
    3. -S オプション指定時に、環境変数 PATH による Ruby スクリプトの探索に 加えて、この環境変数で指定したディレクトリも探索対象になります。(PATH の値よりも優先します)。
    4. systemなどでコマンドを実行するときに検索するパスです。設定されていな いとき(nilのとき)は "/usr/local/bin:/usr/ucb:/usr/bin:/bin:." で検索さ れます。
  3. 次のプログラムの実行結果として正しいものを選びなさい。

    ENV["TERM"] = "screen"
    fork do
      ENV["TERM"] = "ansi"
      fork do
        ENV["TERM"] = "xterm"
      end
      Process.wait
    end
    Process.wait
    puts(ENV["TERM"])
    1. screen
    2. ansi
    3. xterm
    4. nil

1.4.Irb

  1. irb(Interactive Ruby)の説明として正しいものを選びなさい。
    1. Rubyの式を標準入力から簡単に入力/実行するためのツールです。
    2. Rubyインタプリタです。
    3. コマンドラインからRDoc形式で書かれたRubyのリファレンスを参照するツールです。
    4. Rubyのソースファイルに対するドキュメントを生成するアプリケーションです。
  2. readlineがサポートされている場合、irbは補完入力機能が使えます。 補完入力機能を有効にすると、例えば次のような動作をします。

    $ irb
    irb(main):001:0> [1, 2, 3].rev
    (ここで[TAB]キーを押す。すると以下のように「erse」が補完される。)
    irb(main):001:0> [1, 2, 3].reverse

    irbの補完入力機能を有効にする設定方法として正しいものを選びなさい。

    1. irbを起動後、「conf.use_prompt = true」を実行する。

      $ irb
      irb(main):001:0> conf.use_prompt = true
    2. irbを起動後、"irb/completion"を読み込む。

      $ irb
      irb(main):001:0> require "irb/completion"
    3. irbの設定ファイル(~/.irbrcなど)に次の設定を行う。

      IRB.conf[:ECHO] = false
    4. irbのコマンドラインオプションとして、--readlineを指定する。

      irb --readline
  3. Rubyインタプリタは通常、ある名前が変数であるかどうか判定するための代入 文を探します。そして、その名前に何も代入されていなければ、それをメソッ ド呼び出しとみなします。

    $ ruby
    eval "var = 10"
    var
    (Ctrl-Dを入力する)
    -:2: undefined local variable or method `var' for main:Object (NameError)

    これをふまえて、irbで同様のことを行ったときの実行結果として、正しいも のを選びなさい。

    $ irb
    irb(main):001:0> eval "var = 10"
    => 10
    irb(main):002:0> var
    1. Rubyインタプリタと同様に例外(NameError)が発生する。
    2. nil
    3. 10
    4. ""
  4. irbを起動後、irbコマンドによりサブirbを起動できます。 複数のサブirbを使用した次の操作をした場合の正しい出力を選びなさい。

    $ irb
    irb(main):001:0> a = 10
    => 10
    irb(main):002:0> irb
    irb#1(main):001:0> a = 20
    => 20
    irb#1(main):002:0> irb
    irb#2(main):001:0> a = 30
    => 30
    irb#2(main):002:0> fg 0
    => #<IRB::Irb: ...
    irb(main):003:0> puts(a)
    1. 10
    2. 20
    3. 30
    4. 例外(NameError)が発生する。

2.文法

2.1.コメント

  1. 次のコメントのつけ方の中で不適切なものを選べ
    1. あ行を表示するプログラム

      p "a i u e o" # a gyou
    2. か行を表示するプログラム

      # ka gyou
      p "ka ki ku ke ko"
    3. さ行を表示するプログラム

      =begin
      sa gyou
      =end
      p "sa si su se so"
    4. た行を表示するプログラム

      p "ta ti tu te to" =begin ta gyou =end
  2. 次の中でマッチする正規表現を選べ
    1. "ai ue o" =~ /^ai (?#ue)ue o$/
    2. "ai ue o" =~ /^ai (?#{ue})ue o$/
    3. "ai ue o" =~ /^ai (?#{ue})ue o$/x
    4. "ai ue o" =~ /^ai (#ue)ue o$/
  3. 次のプログラムの実行結果を選択せよ

    p 'Led Zeppelin#Black dog#1994#Led Zeppelin IV'.split("#") 
    1. ''でくくられた文字列中の#がコメントとして解釈されてエラー
    2. ""でくくられた#がコメントとして解釈されてエラー
    3. 配列に分割される

2.2.リテラル

  1. 次のプログラムでリテラルはどこか

    # 正方形の面積を求める
    area = side ** 2
    1. # 正方形の面積を求める
    2. area
    3. side
    4. 2
  2. 次の文字列リテラルにマッチする正規表現リテラルはどれか

    ”aiueo\nkakikukeko"
    1. /aiueo.kakikukeko/s
    2. /aiueo.kakikukeko/
    3. /aiueo.kakikukeko/n
    4. /aiueo.kakikukeko/m
  3. 次のプログラムの実行結果から予測されるものを選択しなさい。""で括られたものを文字列リテラルと呼び、:から始まるものをシンボルと呼びます。

    p "aiueo" == "aiueo"
    p "aiueo".object_id == "aiueo".object_id
    p :aiueo == :aiueo
    p :aiueo.object_id == :aiueo.object_id

    実行結果

    true
    false
    true
    true
    1. 文字列リテラルとシンボルは同じものである
    2. 一度生成した文字列リテラルを使いまわしている
    3. シンボルは毎回生成しなおしている
    4. 一度生成したシンボルを使いまわしている

2.3.変数/定数とスコープ

  1. 次のうち、ローカル変数であるものを選択してください。
    1. Foobar
    2. example
    3. $local
    4. @local
  2. 次のプログラムの実行結果として正しいものを選択してください。

    val1 = 100
    if val1 == 100 then
      val2 = 200
    end
    puts val2
    1. 200 が出力される
    2. “undefined local variable or method `val2'”エラーが表示される
    3. 0 が出力される
    4. nil が出力される
  3. クラス変数の説明として、誤っているものを選択してください。
    1. クラスから生成した全てのインスタンスで共通した値を保持する
    2. 変数名は「@@変数名」の形式である
    3. 親クラスを継承したサブクラスのインスタンスからは、親クラスのクラス変数を参照・代入できない
    4. クラス変数は、インスタンスメソッドから参照・代入ができる
  4. 次のうち、定数の説明として誤っているものを選択してください。
    1. アルファベットの大文字(A〜Z)で始まる名前を持つ。
    2. 一度定義された定数に再度値を代入すると、警告が出る。
    3. 定義されていない定数を参照すると、nilを返す。
    4. メソッド内では定数を定義することができない。

2.4.演算子

  1. 次の各行を独立して実行した場合、エラーとなる行があった。エラーとなった行について正しく述べているのはどれか。

    A:   1 << 1   
    B:   1 << 1.0
    C: 1.0 << 1
    D: 1.0 << 1.0
    1. C行, D行がエラーとなった。
    2. B行, D行がエラーとなった。
    3. D行のみエラーとなった。
    4. B行, C行, D行がエラーとなった。
  2. 次の実行結果として出力されるのはどれか?

    p(7 + 10 * 4 / 3 * 6.0)
    1. 85
    2. 85.0
    3. 87
    4. 87.0
  3. 演算子式の定義として間違っているものはどれか。
    1. def `(arg) ... end
    2. def -(other) ... end
    3. def +=(value) ... end
    4. def -@ ... end

2.5.条件分岐

  1. どのような数値x, yについても、その大小関係が表示される結果と一致するようにしたい。例えば、以下のように表示される。

    x=5、y=1 -> xはyより大きいです。
    x=1、y=5 -> xはyより大きくないです。
    x=2、y=2 -> xはyより大きくないです。

    A, Bに入れる組み合わせとして正しいものを選べ。

    [A] x [B] y
      puts "xはyより大きくないです。"
    else
      puts "xはyより大きいです。"
    end
    1. Aは 「if」, Bは 「<」が入る。
    2. Aは 「if」, Bは 「>」が入る。
    3. Aは 「unless」, Bは 「<」が入る。
    4. Aは 「unless」, Bは 「>」が入る。
  2. 以下のコードを実行した場合、"num は 0 か 1 です。"という出力結果を得た。A, Bに入れる組み合わせとして正しいものを選べ。

    num = 1 
    
    [A] num 
    [B] 0, 1
      puts "num は 0 か 1 です。"
    [B] 2, 3
      puts "num は 2 か 3 です。"
    else
      puts "num は 0, 1, 2, 3 のいずれでもありません。"
    end
    1. Aは「switch」, Bは「case」が入る。
    2. Aは「case」, Bは「switch」が入る。
    3. Aは「case」, Bは「when」が入る。
    4. Aは「when」, Bは「case」が入る。
  3. 以下のようなコードの実行結果として適切なものを選びなさい。

    a = 10
    if a > 0
      puts "a > 0"
    else if a < 0
      puts "a < 0"
    else 
      puts "a == 0"
    end
    1. "syntax error" と出力される。
    2. "a > 0" と出力される。
    3. "a < 0" と出力される。
    4. "a == 0" と出力される。

2.6.ループ

  1. 以下の実行結果はどうなるか?

    sum = 0 
    
    10.times do |i| 
      sum += i
    end
    
    p sum 
    1. 45 と表示される。
    2. 55 と表示される。
    3. 0 と表示される。
    4. 66 と表示される。
  2. 以下を実行した場合、method_a()は何回呼び出されるか?

    i = 10
    
    until i < 0 
      # A処理
      method_a()
      i -= 1
    end
    1. 9 回
    2. 10 回
    3. 11 回
    4. 12 回
  3. each, loop の説明として最も適切な文を一つ選べ。
    1. each, loop 共にメソッドである。
    2. each, loop 共にメソッドではない。
    3. each はメソッドであるが、loop はメソッドではない。
    4. loop はメソッドであるが、each はメソッドではない。

2.7.例外処理

  1. 次のプログラムは、ファイルが開けるようになるまで 15 秒ごとに open メソッドを実行して、成功するとその内容を出力するものです。<A>に入るものを選択してください。

    file = ARGV[0]
    begin
      io = open(file)
    <A>
      sleep(15)
      retry
    end
    
    puts io.read
    io.close
    1. rescue
    2. ensure
    3. exception
    4. relief
  2. 次のプログラムを実行した結果として、正しいものを選択してください。

    begin
      raise "error 1."
      raise "error 2."
      raise "error 3."
    rescue
      puts $!
    end
    1. NameError
    2. nil
    3. error 3.
    4. error 1.
  3. 次のプログラムを実行した結果として、正しいものを選択してください。

    begin
      raise "error class."
    rescue => ex
      print ex.class
      exit
    ensure
      print "--end--"
    end
    1. NameError
    2. なにも表示されない
    3. RuntimeError--end--
    4. error class.

2.8.メソッド呼び出し

  1. 次の出力を得るプログラムを以下の中からすべて選択してください。

    5
    6
    7
    8

    1.

    pobj = proc {|i|
      puts i
    }
    (5..8).each(&pobj)

    2.

    for i in 5...9
      puts i
    end

    3.

    class Foo
      def to_proc
        Proc.new {|i| puts i}
      end
    end
    (5..8).each(&Foo.new)

    4.

    print "5\n6\n7\n8\n"
  2. 次のプログラムを実行した結果として、正しいものを選択してください。

    class En
      def en r
        Math::PI * r * r
      end
    end
    
    class Entyuu < En
      def initialize x, r
        @x = x
        @r = r
      end
      def value
        en @r * @x
      end
      def answer
        sprintf("半径%dcm、高さ%dcmの円柱の体積は%0.2fcm^2です。",@r,@x,value)
        return
      end
    end
    
    puts Entyuu.new(2, 3).answer
    1. nil
    2. 半径2cm、高さ3cmの円柱の体積は37.70cm^2です。
    3. 半径3cm、高さ2cmの円柱の体積は56.55cm^2です。
    4. NoMethodError

2.9.ブロック

  1. 次の説明の中で,正しいものを選びなさい.
    1. ブロックの中で初めて代入された変数はブロックの外で直接参照できる。
    2. ブロックの中で初めて代入された変数のスコープはブロックの終了と共に消滅する.
    3. ブロックパラメーターは単なる代入である.
    4. Procオブジェクトをブロック付きメソッドに渡すことはできない.
  2. testメソッドに渡されたブロックのselfは次のうちどれか?

    class Foo
      def test
        (1..3).each{|i| yield(i)}
      end
    end
    
    foo = Foo.new
    foo.test{|i| i }
    1. Foo
    2. foo
    3. トップレベル
    4. 上記のどれにも該当しない
  3. 次の式を実行した場合,正しい出力結果はどれか.次から選べ

    ['foo'].each do |i|
      ['bar'].each do |i|
        print i
      end
      print i
    end
    1. barbar
    2. foofoo
    3. foobar
    4. barfoo

2.10.メソッド定義

  1. 次の演算子の中で,再定義できないものはどれか?
    1. +
    2. ^
    3. !
    4. ~
  2. 次の式の出力結果として,正しいものを選べ

    def foo
      "foo"
    end
    foo = "foo?"
    def self.foo
      "foo!"
    end
    print foo()
    1. "foo"
    2. "foo?"
    3. "foo!"
    4. NoMethodError
  3. 下記のメソッドを呼ぶことができないのは,次のうちどれか.

    def foo(foo, bar = 'bar', *pyo)
      "foo"
    end
    1. foo('foo', 'bar')
    2. foo('foo')
    3. foo('foo', 'bar', 'pyo')
    4. foo

2.11.クラス定義

  1. クラス定義の説明として、間違っているものを選択してください。
    1. クラス定義とは、クラス名を表す定数にClassクラスのインスタンスを代入する操作である。
    2. クラス定義は、「class クラス名」で宣言する。
    3. クラス名は、アルファベットの大文字で始める。
    4. クラス定義の中に、別のクラス定義を記述することはできない。
  2. 次のプログラムの実行結果として、正しいものを選択してください。

    class Foo
      def bar
        print "bar"
      end
    end
    
    class Foo
      def baz
        print "baz"
      end
    end
    
    foo = Foo.new
    foo.bar
    1. “undefined method `bar'”のエラーになる
    2. bar が出力される
    3. baz が出力される
    4. barbaz が出力される
  3. 次のプログラムの実行結果が「<b>abc</b>」となるように、プログラム中の[A]に入る適切な文字列を選択してください。

    str = "abc"
    
    class [A] str
      def foo
        return "<b>" + self + "</b>"
      end
    end
    
    puts str.foo
    1. <
    2. <<
    3. String
    4. ::

2.12.モジュール定義

  1. モジュールに関する以下の説明のうち、間違っているものを選択してください。
    1. モジュールは、「module モジュール名」構文で宣言する。
    2. モジュール定義内には、クラス定義を記述することができる。
    3. モジュール定義内に別のモジュール定義を記述するには「expand モジュール名」と記述する。
    4. モジュールは、Moduleクラスのインスタンスである。
  2. 次のスクリプトを実行した結果として、正しいものを選択してください。

    module Foo
      def bar
        puts "bar"
      end
    end
    
    module Foo
      def bar
        puts "baz"
      end
    end
    
    include Foo
    bar
    1. baz が出力される。
    2. bar が出力される。
    3. “already defined function 'bar'”のエラーになる。
    4. nil が出力される。
  3. 次のプログラムの実行結果として、正しいものを選択してください。

    module Foo
      def initialize
        puts "Foo initialized."
      end
    end
    
    include Foo
    1. Foo initialized. が出力される。
    2. nil が出力される。
    3. “can't define method 'initialize' in module.”エラーになる。
    4. 何も出力されない。

3.組み込みライブラリ

3.1.組み込み関数

  1. 以下のプログラムの実行結果を1つ選択して下さい。

    puts("hello, ")
    exec("echo 'ruby!'")
    puts("world!")
    
    (1) hello, 
    world!
    (2) hello, 
    ruby!
    (3) hello, ruby! world!
    (4) hello, ruby!
  2. 以下のプログラムの実行結果として有り得るものを1つ選択して下さい。

    case rand() {
    when 1
      puts("グー")
    when 2
      puts("チョキ")
    else
      puts("パー")
    }
    1. SyntaxErrorが発生する
    2. 「グー」か「チョキ」か「パー」が表示される
    3. 「グー」か「チョキ」が表示される
    4. 「パー」が表示される
  3. 組み込み関数raiseについて説明する記述の内、適切でないものはどれか。
    1. 例外を発生させます。
    2. 引数が無い場合は、同スレッドの同じブロック内で最後に rescue された例外オブジェクト ($!) を再発生させます。
    3. 例外ではないクラスやオブジェクトを第一引数に指定した場合、実際に発生する例外は全てRuntimeErrorになります。
    4. 発生した例外は変数 $! に格納されます。また例外が発生した時のスタックトレースが変数 $@ に格納されます。

3.2.組み込みクラス

  1. 組み込みクラスHashについて説明する記述の内、適切でないものはどれか。
    1. empty?メソッドはハッシュが空の時真を返します。
    2. shiftメソッドはハッシュから要素をひとつ取り除き、[key,value] という配列として返します。
    3. keysメソッドは全キーの配列を返します。
    4. invertメソッドはキーから値へのハッシュを返します。
  2. 「2800」と出力される以下のプログラムの(A)はどれか

    Book = Struct.new(:price, :publisher)
    ruby_recipe_book = Book.new(2800, "ソフトバンククリエイティブ")
    (A)
    1. puts ruby_recipe_book.price
    2. puts ruby_recipe_book.publisher
    3. puts Book.price
    4. puts Book.publisher
  3. 以下のプログラムを実行した結果、表示されるものを1つ選択して下さい。

    ary = [1, 2, 3, 4, 5]
    p ary[3]  ... (A)
    p ary[10] ... (B)
    p ary[-1] ... (C)
    1. (A)が4、(B)がnil、(C)が5
    2. (A)が4、(B)がIndexError、(C)が5
    3. (A)が3、(B)がIndexError、(C)がIndexError
    4. (A)が3、(B)がnil、(C)がnil
  4. 以下のプログラムを実行した結果、表示されるものを1つ選択して下さい。

    ["perl", "perl", "python", "python", "ruby", "ruby"].each do |line|
      puts line if line =~ /python/ .. line =~ /ruby/
    end
    
    (1) perl
    python
    ruby
    (2) python
    ruby
    (3) python
    python
    ruby
    (4) python
    python
    ruby
    ruby

4.オブジェクト指向

4.1.ポリモルフィズム

  1. 以下のプログラムを実行すると「The object is foo.」といった出力を得た. <A>に入るものはどれか.

    class Foo
      def <A>
        return "foo"
      end
    end
    
    o = Foo.new
    print("The object is ", o, ".")
    1. 「to_string」
    2. 「toString」
    3. 「to_str」
    4. 「to_s」
  2. 以下のプログラムを実行すると「6666」といった出力を得た. <A>に入るものはどれか.

    def area(width, height)
      return <A>
    end
    
    print(area(2, 3))
    print(area(2, "3"))
    print(area("2", 3))
    print(area("2", "3"))
    1. 「width.to_i * height.to_i」
    2. 「atoi(width) * atoi(height)」
    3. 「width.to_f * height.to_f」
    4. 「atof(width) * atof(height)」
  3. Rubyでポリモルフィズムを使うにあたり,正しいものを全て選べ.
    1. interface宣言でクラスのインターフェースを定義する.
    2. 引数の数と名前が一致するメソッドを用意する.
    3. 既存のクラスに対しても特異メソッド定義を行うことで対応できる.
    4. 共通のメソッドにはvirtual宣言が必要である.

4.2.継承

  1. 以下のプログラムの実行結果として正しいものはどれか.

    class Foo
      attr_reader :foo_1
    
      def initialize
        @foo_1 = 10
      end
    end
    
    class Bar
      def initialize
      end
    end
    
    p Bar.new.foo_1
    1. 「nil」と出力される
    2. 「10」と出力される
    3. NoMethodError例外が発生する
    4. ArgumentError例外が発生する
  2. 以下のプログラムの実行結果として正しいものはどれか.

    class Foo
      def foo(x)
        print("foo", x)
      end
    end
    
    class Bar < Foo
      def foo(x, y = 2)
        super
        print("bar", x, y)
      end
    end
    
    Bar.new.foo(1)
    1. 「foo1」と出力される
    2. 「bar12」と出力される
    3. 「foo1bar12」と出力される
    4. ArgumentError例外が投げられる
  3. 以下のプログラムの実行結果として正しいものはどれか.

    class Foo
      def bar
        puts "bar"
      end
    end
    
    class Baz < Foo
      def fizz
        puts "fizz"
      end
    end
    
    baz = Baz.new
    
    p baz.is_a?(Foo)
    1. false が表示される.
    2. “uninitialized constant”例外(NameError)が発生する.
    3. nil が表示される.
    4. true が表示される.

4.3.mix-in

  1. 以下のプログラムの実行結果として正しいものはどれか.

    module Bar
      def foo
        print("bar")
      end
    end
    
    class Foo
      def foo
        print("foo")
      end
    
      include Bar
    end
    
    Foo.new.foo
    1. 「foo」と出力される
    2. 「bar」と出力される
    3. ArgumentError例外が投げられる
    4. NoMethodError例外が投げられる
  2. 次のプログラムの[ A ]を埋めて、実行結果として“foo”が出力されるように、正しいものを選択せよ.

    module Foo
      def foo
        return "foo"
      end
    end
    
    class Bar
      extend Foo
    end
    
    puts [ A ]
    1. Bar.new.foo
    2. Bar.foo
    3. foo("foo")
    4. Bar.include(Foo).foo
  3. 以下のプログラムの実行結果として正しいものはどれか.

    module Foo
      def foo
        puts @bar
      end
    end
    
    class Fizz
      include Foo
    
      def initialize
        @bar = "Fizz"
      end
    end
    
    class Baz < Fizz
      def initialize
        @bar = "Baz"
      end
    end
    
    Baz.new.foo
    1. NoMethodError例外が投げられる
    2. Baz が出力される
    3. Fizz が出力される
    4. nil が出力される

改訂履歴

1.1.実行方法の問題2

2.3.変数/定数とスコープ

2.4.演算子

2.8.メソッド呼び出し

3.2.組み込みクラス4

その他