問題は四択で10問ずつ合計60問あります。各問題には解答がついていますが、はじめは閉じた状態でトライしてみてください。
10問毎に「終了/採点」ボタンをクリックすると採点ができます。次の10問へお進みください。繰り返しトライすることも可能です。
[コード] class Person __(1)__ :name end
person = Person.new person.name = "Suzuki" puts "Hello, " + person.name
[実行結果] Hello, Suzuki
解説
選択肢中のメソッドはそれぞれ以下のような機能を提供します。
attr_reader :name
nameで指定した名前のインスタンス変数「@name」に設定された値を返すメソッドを定義します。「オブジェクト.name」という形式で使用することができます。
attr_writer :name
nameで指定した名前のインスタンス変数「@name」に値を設定するメソッドを定義します。「オブジェクト.name=(引数)」という形式で使用することができます。
attr_accessor :name
上記2つのメソッドの両方を呼び出すメソッドです。インスタンス変数の参照と変更ができます。
module_functionはモジュール関数を指定するメソッドです。
[コード] /(\d+)/ =~ "hello24world" puts __(1)__
[実行結果] 24
解説
正規表現内の括弧を記述すれば、その位置にマッチした文字列を後から参照することができます。
括弧は正規表現内で複数使用することができますが、一致した文字列は括弧が出現した順番に、特殊なローカル変数$1, $2, $3...の順番で代入されます。
問題では、括弧を1つ使用しているだけですので、正規表現に一致した文字列を取得する場合、「$1」を使用します。
[コマンドライン] $ ruby __(1)__ 'p 1024 * 5'
[実行結果] 5120
解説
-eオプションは引数で指定した文字列を評価して、結果を出力するオプションです。
[コード] class Person def __(1)__(name) @name = name end def info puts "My name is #{@name}." end end Person.new("Jim").info
[実行結果] My name is Jim.
解説
initializeメソッドは、オブジェクトの初期化処理を定義するメソッドです。
オブジェクトが生成されるときに呼び出されます。
[コード] class Class1 def set_value(value) @value = value end
def get_value return @value end end
obj1 = Class1.new obj1.set_value("value1") puts obj1.get_value obj2 = Class1.new puts obj2.get_value
解説
@で始まる名前の変数はインスタンス変数です。
インスタンス変数はインスタンスメソッド内で使用します。
この変数はオブジェクト毎に異なるデータを保持することができます。
未初期化時に参照してもエラーにならず、nilが返されます。
[コード] ary = [:job1, :job2, :job3] ary.push(:job4) ary.unshift(:job5) ary.pop ary.shift p ary
解説
Array#push, Array#pop, Array#unshift, Array#shiftはすべて配列の要素の追加と取り出しを行うメソッドです。
ary = [:job1, :job2, :job3]
ary.push(:job4)
p ary #=> [:job1, :job2, :job3, :job4]
ary.unshift(:job5)
p ary #=> [:job5, :job1, :job2, :job3, :job4]
ary.pop
p ary #=> [:job5, :job1, :job2, :job3]
ary.shift
p ary #=> [:job1, :job2, :job3]
[コード] ary = Array.new(3, "a") ary[0].next! p ary
解説
Array.newは配列オブジェクトを生成します。
newメソッドには2つの引数を指定することができ、1つ目には配列の要素数、2つ目には要素の初期値を指定します。
問題文の「Array.new(3, "a")」では「["a", "a", "a"]」という配列が生成されます。
ここでの各要素は同じオブジェクトを参照することにご注意ください。
[コード] class MyNum attr_reader :num def initialize(num) @num = num end __(1)__ end
num1 = MyNum.new(30) num2 = MyNum.new(10) num3 = MyNum.new(20) p [num1, num2, num3].sort.map{|n| n.num }
[実行結果] [10, 20, 30]
解説
問題文のコードでは配列に対してsortメソッドを呼び出しています。
sortメソッドは、配列の要素に対して<=>演算子を使用して比較します。
数値や文字列などの既存のオブジェクトに関しては、<=>演算子が定義されているので、sortメソッドを使用することができますが、作成したクラスのオブジェクトには、<=>演算子を定義する必要があります。
[コード] var1 = __(1)__ var2 = __(1)__
puts var1.equal?(var2)
[実行結果] true
解説
Object#equal?はオブジェクト同士の同一性判定用のメソッドです。引数で指定したオブジェクトがレシーバ自身であればtrueを返します。
:helloはシンボルオブジェクトを表しており、文字列が同じであれば同じオブジェクトを参照します。
[コード] a, b = [1, 2, 3] p a p b
解説
Rubyは多重代入をサポートしておりますので、一度に複数の変数に代入することができます。問題文のコードは下記のコードと同様です。
a = 1
b = 2
左辺の変数の数より、右辺の値の数の方が多い場合は残りの値を破棄します。