問題は四択で10問ずつ合計60問あります。各問題には解答がついていますが、はじめは閉じた状態でトライしてみてください。
10問毎に「終了/採点」ボタンをクリックすると採点ができます。次の10問へお進みください。繰り返しトライすることも可能です。
[コード1] class Foo Const = "foo" def foo puts Const end end Foo.new.foo
[コード2] module M def foo puts Const end end class Foo Const = "foo" include M end Foo.new.foo
解説
コード1のfooメソッドはクラス内で定義した定数Constを参照しておりますので、エラーになりません。
コード2のfooメソッドはモジュール内で定義した定数Constを参照してしまい、未定義なのでエラーになります。
[コード1] class Foo def foo puts "foo" end end class Bar < Foo def foo puts "bar" end end class Bar undef_method :foo end Bar.new.foo
[コード2] class Foo def foo puts "foo" end end class Bar < Foo def foo puts "bar" end end class Bar remove_method :foo end Bar.new.foo
解説
コード1でfooメソッドは未定義化されておりますのでメソッド呼び出し時にエラーになります。
コード2では、メソッドの未定義化にremove_methodを使用しておりますが、このメソッドはスーパークラスに同名のメソッドがある場合にそれが呼ばれるので、エラーになりません。
[コード] 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
解説
aliasはメソッドに別名をつけるためのキーワードです。
undefはメソッドを未定義化するためのキーワードです。
問題文中のコードでは、fooメソッドが定義された後に未定義化されておりますので、fooメソッドの呼び出しでは、superによって問題なく親クラスの同名のメソッドが呼ばれます。
[コード] CONST = "message1" class Foo CONST = "message2" def foo puts __(1)__ end end Foo.new.foo [実行結果] message1
解説
定数名の先頭の「::」はトップレベルを表し、「::Const」でトップレベルにある定数を参照することができます。
[コード] class Person def initialize(name) @name = name end def __(1)__ "My name is #{@name}" end end p Person.new("taro")
[実行結果] My name is taro.
解説
inspectメソッドはpメソッドでオブジェクトそのものを出力した際の文字列表現を指定するメソッドです。
解説
FileTestモジュールはファイルやディレクトリの検査を行う機能をまとめたモジュールです。
[コード] 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)
[コード] class Bar def foo puts "barbarbar" end end class Foo < Bar def initialize(obj) obj.foo end def foo puts "foofoofoo" end end Foo.new(Foo.new(Bar.new))
[コード] p Class.superclass
解説
ClassクラスのスーパークラスはModuleクラスです。