- A. super
- B. begin
- C. try
- D. goto
解答
C,D
def foo (a, *b)
p a
end
foo(1,2,3,4)
- A. nil
- B. 1
- C. エラーが発生 *構文エラー、例外などは、一律「エラーが発生」と表記する。
- D. []
- E. [1]
puts({"members" => 193, "year" => 2014}.size)
- A. 15
- B. 6
- C. 4
- D. 2
t = Time.now + (60*60*24)
p t
- A. 実行時の日時が表示される
- B. 実行時の日時から24時間後(86400秒後)の日時が表示される
- C. エラーが発生
- D. nil
解答
B
+ otherでother秒後の日時が返されます。TimeクラスはTime#to_s、Time#to_iなどの変換やmktimeで任意の日時のオブジェクトを作成する方法を理解しておく必要があります。
- A. _365
- B. z
- C. 7years
- D. break
- E. latitude
(5..8).each_with_index do |val,i|
puts "#{i} #{val}"
end
- A.
1 5
2 6
3 7
4 8
- B.
0 5
1 6
2 7
3 8
- C.
5 1
6 2
7 3
8 4
- D.
5 0
6 1
7 2
8 3
- E.
エラーが発生
解答
B
eachはRubyで最もよく使われるイテレーター(ブロックが渡されることを想定しているメソッド)です。each_with_indexでは要素とインデックスをブロックに渡して繰り返し実行されます。
p 100.downto(90).select{|x| x%2==0}
- A. [100,99,98,97,96,95,94,93,92,91,90]
- B. [90,92,94,96,98,100]
- C. [100,98,96,94,92,90]
- D. []
解答
C
Integer#downto(min)は、引数minまで数を1ずつ減らしながら実行されます。その後、selectメソッドで、要素に対してブロックの評価が真であった要素をすべて含む配列が返されます。
p [1,1,2,3,5,8].__(1)__{|x| x*2}
[出力]
[2,2,4,6,10,16]
- A. compact
- B. collect
- C. map
- D. flatten
- E. join
解答
B,C
各要素に対してブロックを評価した結果を全て含む配列を返します。Enumerableは頻出問題です。Enumerable#collectに対するEnumerable#map、findに対するdetectなど同じ挙動をするメソッドはRubyの公式ドキュメントを見て覚えておきましょう。
puts "Ruby on Rails".delete("Rails")
- A. エラーが発生
- B. Ruby on
- C. Rails
- D. uby on
- E. Ruby
doc = <<EOF
The quick brown fox
jumps over the lazy dog
EOF
- A. 1行目は、doc = <<-EOFと書く
- B. 最後のEOFは>>EOFと書く
- C. 最後のEOFは行頭におく
- D. 1行目は、doc = << EOFと書く
解答
A,C
ヒアドキュメントは <<識別子' を含む行の次の行から
識別子' だけの行の直前までを文字列とする行指向のリテラルです。(Ruby公式ドキュメントより抜粋)
終端行の識別子前に余分な空白を含めるとエラーとなります。ただし、<<-識別子' のように
-' を付けて書くことで終端行をインデントすることは可能です。
h = {1=>2, 3=>4}
h.__(1)__
p h #=>{}
ary = [1, 2]
ary.__(1)__
p ary #=>[]
- A. clear
- B. remove
- C. destroy
- D. empty?
a = [1,2,3,4,5]
p __(1)__ #=>[1,2,3]
- A. a[0..2]
- B. a[1..2]
- C. a.slice(0,3)
- D. a.slice(0...2)
解答
A,C
Silver試験では配列の添字演算子[ ]の特徴の理解が要求されます。
a = [1,2,3,4,5]
p a[0] #=>1
負の添字も存在します。-1であれば最後の要素となります。
p a[-2] #=>4
長さを指定する場合
p a[0,2] #=>[1,2]
その他の表記法
p a[0..1] #=> [1,2]
p a[0...1] #=>[1]
p a[-2..4] #=>[4.5]
p a[-1..1] #=>[]
今までの表記は下記、Array#[]のシンタックスシュガーです。
p a[].()
p a[].(0) #=>1
Array#sliceはArray#[]の別名です。
str = "RubyAssociation".chomp
- A. "RubyAssociation\r"
- B. "RubyAssociation"
- C. "RubyAssociation\r\n"
- D. "RubyAssociation\r\n\r\n"
解答
B
String#chompは文字列末尾の改行文字を削除するためのメソッドです。テキストから文字列を1行ずつ読み込んでいく際に改行文字を削除するような使い方ができます。String#chompは文字列末尾の\r、\r\n、\nを削除しますが、他の文字は削除しません。String#chomp!はレシーバーの文字列自体を変更する破壊的メソッドです。
str = "RubyAssociation\r\n".chop
- A. "RubyAssociation"
- B. "RubyAssociation\r"
- C. "RubyAssociation\r\n"
- D. "RubyAssociation\r\n\r\n"
解答
A
String#chopは文字列末尾の文字を1文字削除するためのメソッドです。String#chompが改行文字を対象するのに対しchopはすべての文字を対象とします。ただし、文字列末尾が\r\nの場合は、2文字とも削除します。String#chop!はレシーバーの文字列自体を変更する破壊的メソッドです。
File.open("foo.txt","r") do |io|
puts io.gets
puts io.read
io.rewind
p lines = io.readlines
end
- A. データを全て読み込んで、その各行を要素としてもつ配列を返す
- B. ファイルポインターをファイルの先頭に移動する
- C. IO から1バイトを読み込み整数として返す
- D. レシーバと同じ IO を参照する新しい IO オブジェクトを返す
解答
B
IO#rewindはファイルポインターを先頭に移動させます。
IOクラスでは、IO#rewindの他に、 seek、gets、read、readlineなどのインスタンスメソッドをドキュメントでチェックしておく必要があります。
mozart = ["Symphony","Piano Concerto", "Violin Concerto","Horn Concerto","Violin Sonata"]
listend = ["Symphony","Violin Concerto","Horn Concerto"]
p mozart__(1)__listend
[出力]
["Piano Conerto","Violin Sonata"]
- A. |
- B. &
- C. -
- D. +
解答
C
配列の要素(集合)に対して演算子を適用することができます。
試験前に、Array#演算子についてRuby公式ドキュメントを確認しておいてください。
ary1 = [1,2,3,4,5]
ary2 = [3,4,5,6,7]
p ary1 | ary2 #=>[1,2,3,4,5,6,7]
p ary1 & ary2 #=> [3,4,5]
p ary1 - ary2 #=>[1,2]
odd = [1,3,5]
even = [2,4,6]
num = odd + even
p num.sort
- A. nil
- B. []
- C. [1,3,5,2,4,6]
- D. [1,2,3,4,5,6]
解答
D
Array#+は自身に引数の内容を繋げた配列を返します。この問題では返された配列に対してArray#sortを使い数値を並び替えています。配列を連結するメソッドとしてArray#concatがありますが、こちらは引数で渡された配列を自身に対して破壊的に連結します。
/^[hc].*o$/i
- A. Hello
- B. holland
- C. Cello
- D. h35L320
解答
A,C
Silverの試験ではアルファベットの大文字小文字を含んだ単語の区別、文字列と数字の簡単な組み合わせなど簡単な正規表現について理解していることを要求されます。問題の正規表現はhもしくはcで始まりoで終わる文字列とマッチします。またiのオプションを付けることにより大文字、小文字の区別を無視しています。
Greeting = "Hello Ruby"
Greeting = "Hi Ruby"
p Greeting
- A. エラーが発生
- B. Greetingは定数のためwarningが発生するが、"Hi Ruby"と出力される
- C. Greetingは定数のため"Hello Ruby"が出力される
- D. Greetingは定数のためwaringが発生して"Hello Ruby"と出力される
解答
B
p File.join("ruby", "exam","silver")
- A. "./ruby"
- B. "./ruby/exam/silver"
- C. "rubyexamsilver"
- D. "ruby/exam/silver"
class Surface
attr_reader :s
def initialize(x,y)
@s = x * y
end
end
class Volume < Surface
attr_reader :v
def initialize(x,y,z)
super(x,y)
@v = x * y * z
end
end
a = Volume.new(2,5,5)
puts "#{a.v},#{a.s}"
- A. 50,10
- B. エラーが発生
- C. 50,50
- D. 10,10
解答
A
VolumeクラスはSurfaceクラスを継承しています。
superを使えば、スーパークラスの同名のメソッドを呼び出すことことができます。superには通常のメソッドと同じように引数も指定可能です。
string = "test code"
string.slice(0,4)
p string
- A. "test"
- B. "test code"
- C. nil
- D. ""
解答
B
String#slice(nth, len)は文字列のnth目からlen文字の文字列を作って返します。
String#sliceは非破壊的なので、文字列"test code"が表示されます。代りに破壊的なメソッドであるString#slice!を使用すると、"code"と表示されます。
puts "ruby".encoding.name
- A. UTF-8
- B. エラーが発生
- C. US-ASCII
- D. ASCII-8BIT
cc = {"nz"=>"New Zealand", "ru"=>"Russia", "ar"=>"Argentina"}
- A. p cc.has_key?('nz')
- B. p cc.contain?('nz')
- C. p cc.key?('nz')
- D. p cc.include?('nz')
- E. p cc.member?('nz')
解答
B
以下のメソッドはHashがkeyをキーとして持つときはtrueを返します。
Hash#has_key?(key) -> bool
Hash#include?(key) -> bool
Hash#key?(key) -> bool
Hash#member?(key) -> bool
p "Hello there".class
p String.superclass
class Foo; end
class Bar < Foo; end
p Foo.superclass
p Bar.superclass
- A.
String
Kernel
Module
Module
- B.
Object
Module
Object
FooClass
- C.
String
Module
String
FooClass
- D.
String
Object
Object
Foo
- E.
Object
Object
Module
Kernel
解答
D
class()メソッドはオブジェクトのクラス、superclass()メソッドはそのクラスのスーパークラスを返します。明示的にスーパークラスを指定しない場合はObjectがスーパークラスとなります。
s = "To be or not to be, that is the question."
hash = Hash.new(0)
s.__(1)__(__(2)__) {|i| hash[i] += 1}
p hash["be"] #=>2
- A. (1)match (2)/\w+/
- B. (1)sub (2)/\w+/
- C. (1)scan (2)/\w+/
- D. (1)search (2)/\w+/
解答
C
問題のコードでは正規表現パターンにマッチした文字列が繰り返しブロック引数に渡され実行されます。matchが一度しか正規表現によるマッチを行わないのに対し、scanは繰り返しマッチを行います。正規表現の\wは単語構成文字 [a-zA-Z0-9_]の省略記法です。今回は単語をハッシュのキー、出現回数を値として、単語の出現回数に応じて値をインクリメントさせています。
- A. 引数を指定しなかった場合はエラーが発生する。
- B. 指定されたエンコーディングでselfを正しく解釈できない場合はnilが返される。
- C. 引数で与えられたencodingにおいて、selfを文字コードと見なし、それに対応する一文字からなる文字列を返す。
- D. 指定されたエンコーディングでselfを正しく解釈できない場合はエラーが発生する。
解答
C,D
Integer#chrは文字コードに対応する1文字の文字列を返します。 p 12354.chr(Encoding::UTF_8) #=>"あ" selfを引数で与えられたエンコーディングで正しく解釈できない場合は、RangeErrorが発生します。
s = "foo"
___(1)___
s[4] = ?b
___(2)___
puts "error"
end
- A. ___(1)は「try」、(2)___は「catch NameError」である
- B. ___(1)は「try」、(2)___は「catch IndexError」である
- C. ___(1)は「begin」、(2)___は「rescue NameError」である
- D. ___(1)は「begin」、(2)___は「rescue IndexError」である
解答
D
Rubyの例外処理の書き方を以下に示します。
begin
<例外が起こる可能性のある処理>
rescue => <例外オブジェクトが代入される変数>
<例外が起こった場合の処理>
end
Silver試験では、発生する例外の種類と処理に関しての知識が問われます。
ary = []
ary << 1 && false
true || ary << 2
false && ary << 3
false || ary << 4
p ary
- A. [1, 4]
- B. [1, 2, 3, 4]
- C. [1]
- D. [1, 2, 3]
解答
A
論理演算子の評価方法について、&&演算子においては左辺が真と評価されたときのみ右辺も評価されます。同じように||演算子においては、右辺が評価されるのは、左辺が偽と評価された場合です。
p "foo" * 2 **2
- A. エラーが発生
- B. "foo4"
- C. "foofoofoofoo"
- D. "foofoo"
foo = [1,2,3]
bar = foo
baz = foo.dup
bar[3] = 4
p foo
p bar
p baz
A.
[1,2,3]
[1,2,3,4]
[1,2,3]
B.
[1,2,3,4]
[1,2,3,4]
[1,2,3,4]
C.
[1,2,3,4]
[1,2,3,4]
[1,2,3]
D.
エラーが発生
解答
C
foo,barは同じ配列オブジェクトを参照しています。
例題と同じ内容で以下のメソッドを実行すると、以下のようになります。
foo.object_id # barと同じ整数値
bar.object_id # fooと同じ整数値
baz.object_id # 上記2つとは違う整数値
- A. readlines
- B. read
- C. gets
- D. readline
- E. find
解答
C,D
IO#getsとIO#readlineはファイルオブジェクトから一行読み込んで、読み込みに成功した時にはその文字列を返します。IO#getsとIO#readlineの違いはEOFに到達した時の振る舞いのみです。IO#getsはnil, IO#readlineはEOFErrorを返します。
str = "a,b,c,d"
p str.split(/,/, 2)
- A. ["a", "b,c,d"]
- B. ["a","b","c","d"]
- C. ["a", "b,c,","d"]
- D. "abcd"
class Object
def greeting
print "How are you?\n"
end
end
[1,2].greeting
- A. エラーが発生
- B. nilが表示される
- C. How are you?
- D. [1,2]
解答
C
ArrayクラスはObjectクラスを継承しています。Rubyでは組み込みクラスを含め定義済みのクラスに対してメソッドを追加することができます。また追加だけではなく既存のメソッドを書き換えることもできます。
/[0-9]{3}-[0-9]{4}/
- A. 0x000000
- B. 0-93-0-94
- C. 93094
- D. 333-4421
/[0-9]{3}-[0-9]{4}/
- A. []
- B. ["a", "b", "c", "d", "e", "f"]
- C. nil
- D. "abcdef"
解答
B
File.open("foo.txt") do |io|
io.write(Time.now.strftime("%Y/%m/%d"))
end
- A. 書き込みモードでファイルが開かれているため
- B. 読み込み可能なfoo.txtが存在しなかったため。
- C. 読み込みモードでファイルが開かれているため
- D. 読み書き両用モードでファイルが開かれているため
解答
C
モードを明示的に指定しない場合、読み込みモード"r"でファイルを開きます。そのため、エラーが発生しています。選択肢Bの場合は、IOErrorではなくErrno::ENOENT(システムコールに依存したエラー)を発生させます。例題では、読み込みモードを"w"として開いた場合のファイルの内容は、Time.nowで得た現在時刻を指定したformat文字列で出力したものになります。(例:2015/06/07)
以下、ファイルオープン時のモード一覧を示します。
"r" 読み込みモード
"w" 書き込みモード。ファイルが存在していればファイルを空にする。
"a" 書き込みモード。ファイルが存在していれば、ファイルの末尾から追記する。
"r+" 読み書き両用モード。ファイルの先頭から読み書きを行う。
"w+" 読み書き両用モード。ファイルが存在していればファイルを空にする。
"a+" 読み書き両用モード。ファイルの末尾から読み書きを行う。
- A. Dir.rmdir
- B. Dir.basename
- C. Dir.pwd
- D. Dir.extname
- E. Dir.getwd
解答
B,D
puts "0123456789".delete("0-58-")
- A. 234679
- B. 9
- C. 679
- D. 123458
- E. 12345
解答
C
String#deleteメソッドでは引数で指定された文字をselfから取り除きます。
-の両端に文字列がある場合は範囲指定をしていることになります。
例題では"0-5"で0から5までの数字を取り除きますが、続く"8-"では範囲指定とは見なされず、8と-を削除します。
p "100,200,300,400,500".___(1)___.___(2)___
[出力]
"100\n200\n300\n400\n500"
- A. (1)split(",") (2)join("\n")
- B. (1)to_a(",") (2)join("\n")
- C. (1)split(",") (2)concat("\n")
- D. (1)concat(",") (2)join("\n")
a = "foo"
b = "foo"
puts a.eql?(b)
puts a.equal?(b)
- A.
true
true
- B.
true
false
- C.
false
true
- D.
false
false
解答
B
メソッド名の最後に?がつくメソッドは通常tureもしくはfalseを返します。String#eql?メソッドは変数aと変数bの文字列が同じ場合にtrueを返します。一方でString#equal?メソッドは変数aと変数bがひとつの同じ文字列を「参照」している場合はtrueとなります。実際にobject_idを確認してみると、値が違うことがわかります。
p a.object_id #=>70174384459980
p b.object_id #=>70174364485360
(実行環境によって結果は異なります。)
numbers = [3,89,40,39,29,10,50,59,69]
num = numbers.inject do |i,j|
i > j ? i : j
end
p num
- A. 89
- B. 40
- C. 10
- D. 59
解答
A
inject (Enumerable)は前回のブロックの戻り値をブロックに渡して繰り返し実行します。 例題では条件演算子を使い、2つの整数値を比較しより大きな値を取り出しそれをブロックに渡しています。
条件演算子(文法) 式1 ? 式1が真だった場合の値 : 式1が偽だった場合の値
p String.instance_methods.grep(/strip/)
- A. [:strip, :lstrip, :rstrip, :strip!, :lstrip!, :rstrip!]
- B. nil
- C. [:strip]
- D. []
- E. エラーが発生
解答
A
Enumerable#grepではパターンにマッチする要素を配列にして返します。例題ではStringクラスのインスタンスメソッドで正規表現/strip/の文字列に一致するものを配列で返します。
A.capital ={:Sweden =>"Stockholm", :Norway=>"Oslo", :Finland=>"Helsinki"}
B.capital = {Sweden: "Stockholm", Norway: "Oslo", Finland: "Helsinki"}
C.capital = {"Sweden" = "Stockholm", "Norway" = "Oslo", "Finland" = "Helsinki"}
D.capital = Hash[:Sweden, "Stockholm", :Norway ,"Oslo", :Finland, "Helsinki"]
解答
C
Hashを生成する方法はいくつか存在しますが、例題では{}とHashのクラスメソッド[ ]を使用しています。Bのように、キーにシンボルを使う場合はコロンをハッシュキーの最後につけると矢印を省略して書けます。
___(1)___ 'uri'
uri = URI::HTTP.build({host:'www.ruby.or.jp', path:'/ja/certification/examination/'})
puts uri
[出力]
http://www.ruby.or.jp/ja/certification/examination/
- A. require
- B. include
- C. extend
- D. import
解答
A
uriはRubyに標準で添付されているライブラリーの1つです。requireすることによって、プログラム内で呼び出すことができます。include、extendはモジュールを読み込む際に使用します。importはRuby以外の言語で同様の目的の際に利用されることがありますが、Rubyでは使えません。
class Foo
___(1)___= 0
def self.count
___(1)___ += 1
end
end
class Bar < Foo
end
puts Foo.count
puts Bar.count
[出力]
1
2
- A. num
- B. @num
- C. @@num
解答
C
@numと@@numはそれぞれ、インスタンス変数とクラス変数です。クラス変数はクラス定義の中で定義され、クラスの特異メソッド、インスタンスメソッドなどから参照/ 代入ができます。例題ではFooクラスとBarクラスの間で値を共有します。@はインスタンス変数です。インスタンス変数は名前の通り特定のオブジェクトに所属しています。(クラスはclassクラスのオブジェクトのためクラスレベルでのインスタンス変数も存在する)Rubyのオブジェクトモデルをより深く理解したい場合は、Silver合格後にGold試験の受験もおすすめします。
unless false || nil
print "Hello\n"
end
- A. Hello
- B. nil
- C. 何も表示されない
- D. false
解答
A
Rubyでは、falseとnilは偽、falseとnil以外は全て真として扱われます。
unless false || nilの条件はif !false && !nil(詳細はドモルガンの法則を参照)と同じ意味です。
numbers = (1..20).to_a
p numbers.detect{|x| x % 5 == 0}
- A. nil
- B. 10
- C. 5
- D. 20
- E. [5,10,15]
解答
C
Enumerable#detectメソッドは要素に対してブロックを評価した値が真になった最初の要素を返します。例題では1~20までの数字に対して一番最初の5の倍数を求めていますので正解はCです。Enumerable#findを使っても同様の結果になります。
class NonasciiError < StandardError
end
File.open("sample.txt") do |io|
io.each_line do |str|
begin
raise(NonasciiError, "non ascii character detected") unless str.ascii_only?
rescue => ex
puts "#{ex.message} : #{str}"
end
end
end
[sample.txtの内容]
Ruby Association
ルビーアソシエーション
るびー
Ruby on Rails
- A. non ascii character detected : ルビーアソシエーション non ascii character detected : るびー
- B. 何も表示されない
- C. non ascii character detected : Ruby Association
- D. non ascii character detected : Ruby on Rails
解答
A
raise関数によって明示的に例外を発生させることができます。例題ではString#ascii_only?を使いテキストにASCII文字以外が使われている場合には例外を発生させています。例外処理の基本形は問題28の解説を参照してください。
- A. 0xA
- B. 0xFF
- C. 012
- D. 077
- E. 0x10
解答
A,C
0xAは16進数、012は8進数です。いずれも10進数では10となります。
puts "#{0xA}" => 10
puts '#{012}' => #{012}
ダブルクォーテーション内では式展開されますが、シングルクォーテーションでは式展開が行われません。
本問題集を利用したことによる損害が生じてもRubyアソシエーションはその責任を負いません。