def foo (a, *b)
p a
end
foo(1,2,3,4)
puts({"members" => 193, "year" => 2014}.size)
t = Time.now + (60*60*24)
p t
(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.
エラーが発生
p 100.downto(90).select{|x| x%2==0}
p [1,1,2,3,5,8].__(1)__{|x| x*2}
[出力]
[2,2,4,6,10,16]
puts "Ruby on Rails".delete("Rails")
doc = <<EOF
The quick brown fox
jumps over the lazy dog
EOF
h = {1=>2, 3=>4}
h.__(1)__
p h #=>{}
ary = [1, 2]
ary.__(1)__
p ary #=>[]
a = [1,2,3,4,5]
p __(1)__ #=>[1,2,3]
str = "RubyAssociation".chomp
str = "RubyAssociation\r\n".chop
File.open("foo.txt","r") do |io|
puts io.gets
puts io.read
io.rewind
p lines = io.readlines
end
mozart = ["Symphony","Piano Concerto", "Violin Concerto","Horn Concerto","Violin Sonata"]
listend = ["Symphony","Violin Concerto","Horn Concerto"]
p mozart__(1)__listend
[出力]
["Piano Conerto","Violin Sonata"]
odd = [1,3,5]
even = [2,4,6]
num = odd + even
p num.sort
/^[hc].*o$/i
Greeting = "Hello Ruby"
Greeting = "Hi Ruby"
p Greeting
p File.join("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}"
string = "test code"
string.slice(0,4)
p string
puts "ruby".encoding.name
cc = {"nz"=>"New Zealand", "ru"=>"Russia", "ar"=>"Argentina"}
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
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
s = "foo"
___(1)___
s[4] = ?b
___(2)___
puts "error"
end
ary = []
ary << 1 && false
true || ary << 2
false && ary << 3
false || ary << 4
p ary
p "foo" * 2 **2
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.
エラーが発生
str = "a,b,c,d"
p str.split(/,/, 2)
class Object
def greeting
print "How are you?\n"
end
end
[1,2].greeting
/[0-9]{3}-[0-9]{4}/
/[0-9]{3}-[0-9]{4}/
File.open("foo.txt") do |io|
io.write(Time.now.strftime("%Y/%m/%d"))
end
puts "0123456789".delete("0-58-")
p "100,200,300,400,500".___(1)___.___(2)___
[出力]
"100\n200\n300\n400\n500"
a = "foo"
b = "foo"
puts a.eql?(b)
puts a.equal?(b)
A.
true
true
B.
true
false
C.
false
true
D.
false
false
numbers = [3,89,40,39,29,10,50,59,69]
num = numbers.inject do |i,j|
i > j ? i : j
end
p num
p String.instance_methods.grep(/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"]
___(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/
class Foo
___(1)___= 0
def self.count
___(1)___ += 1
end
end
class Bar < Foo
end
puts Foo.count
puts Bar.count
[出力]
1
2
unless false || nil
print "Hello\n"
end
numbers = (1..20).to_a
p numbers.detect{|x| x % 5 == 0}
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
C,D
B
*がついた引数は可変長引数(rest引数)です。fooメソッドでは最低1つの引数を必要とします。第一引数は変数aで得ることができ、残りの引数は配列に格納されます。
D
Hash#sizeはHashの要素の数を返します。
B
+ otherでother秒後の日時が返されます。TimeクラスはTime#to_s、Time#to_iなどの変換やmktimeで任意の日時のオブジェクトを作成する方法を理解しておく必要があります。
A,B,E
1文字目はアルファベット小文字か_で始める必要があります。また、2文字目以降はアルファベットもしくは数字を使用します。予約語はローカル変数として使用できません。
B
eachはRubyで最もよく使われるイテレーター(ブロックが渡されることを想定しているメソッド)です。each_with_indexでは要素とインデックスをブロックに渡して繰り返し実行されます。
C
Integer#downto(min)は、引数minまで数を1ずつ減らしながら実行されます。その後、selectメソッドで、要素に対してブロックの評価が真であった要素をすべて含む配列が返されます。
B,C
各要素に対してブロックを評価した結果を全て含む配列を返します。Enumerableは頻出問題です。Enumerable#collectに対するEnumerable#map、findに対するdetectなど同じ挙動をするメソッドはRubyの公式ドキュメントを見て覚えておきましょう。
D
String#deleteはself(メソッドのレシーバーとなったオブジェクト)に含まれる文字を取り除いた文字列を生成して返します。
A,C
ヒアドキュメントは <<識別子' を含む行の次の行から
識別子' だけの行の直前までを文字列とする行指向のリテラルです。(Ruby公式ドキュメントより抜粋)
終端行の識別子前に余分な空白を含めるとエラーとなります。ただし、<<-識別子' のように
-' を付けて書くことで終端行をインデントすることは可能です。
A
clearメソッドは、空の配列、ハッシュを返します。配列とハッシュで類似の動きをするメソッドについて、clearのほかにも、replaceをおさえておきましょう。
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#[]の別名です。
B
String#chompは文字列末尾の改行文字を削除するためのメソッドです。テキストから文字列を1行ずつ読み込んでいく際に改行文字を削除するような使い方ができます。String#chompは文字列末尾の\r、\r\n、\nを削除しますが、他の文字は削除しません。String#chomp!はレシーバーの文字列自体を変更する破壊的メソッドです。
A
String#chopは文字列末尾の文字を1文字削除するためのメソッドです。String#chompが改行文字を対象するのに対しchopはすべての文字を対象とします。ただし、文字列末尾が\r\nの場合は、2文字とも削除します。String#chop!はレシーバーの文字列自体を変更する破壊的メソッドです。
B
IO#rewindはファイルポインターを先頭に移動させます。
IOクラスでは、IO#rewindの他に、 seek、gets、read、readlineなどのインスタンスメソッドをドキュメントでチェックしておく必要があります。
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]
D
Array#+は自身に引数の内容を繋げた配列を返します。この問題では返された配列に対してArray#sortを使い数値を並び替えています。配列を連結するメソッドとしてArray#concatがありますが、こちらは引数で渡された配列を自身に対して破壊的に連結します。
A,C
Silverの試験ではアルファベットの大文字小文字を含んだ単語の区別、文字列と数字の簡単な組み合わせなど簡単な正規表現について理解していることを要求されます。問題の正規表現はhもしくはcで始まりoで終わる文字列とマッチします。またiのオプションを付けることにより大文字、小文字の区別を無視しています。
B
D
File#joinは定数FILE::SEPARATOR "/"を使って文字列を連結します。
A
VolumeクラスはSurfaceクラスを継承しています。
superを使えば、スーパークラスの同名のメソッドを呼び出すことことができます。superには通常のメソッドと同じように引数も指定可能です。
B
String#slice(nth, len)は文字列のnth目からlen文字の文字列を作って返します。
String#sliceは非破壊的なので、文字列"test code"が表示されます。代りに破壊的なメソッドであるString#slice!を使用すると、"code"と表示されます。
A
Ruby 2.0以降では、デフォルトのスクリプトエンコーディングはUTF-8です。
B
以下のメソッドはHashがkeyをキーとして持つときはtrueを返します。
Hash#has_key?(key) -> bool
Hash#include?(key) -> bool
Hash#key?(key) -> bool
Hash#member?(key) -> bool
D
class()メソッドはオブジェクトのクラス、superclass()メソッドはそのクラスのスーパークラスを返します。明示的にスーパークラスを指定しない場合はObjectがスーパークラスとなります。
C
問題のコードでは正規表現パターンにマッチした文字列が繰り返しブロック引数に渡され実行されます。matchが一度しか正規表現によるマッチを行わないのに対し、scanは繰り返しマッチを行います。正規表現の\wは単語構成文字 [a-zA-Z0-9_]の省略記法です。今回は単語をハッシュのキー、出現回数を値として、単語の出現回数に応じて値をインクリメントさせています。
C,D
Integer#chrは文字コードに対応する1文字の文字列を返します。 p 12354.chr(Encoding::UTF_8) #=>"あ" selfを引数で与えられたエンコーディングで正しく解釈できない場合は、RangeErrorが発生します。
D
Rubyの例外処理の書き方を以下に示します。
begin
<例外が起こる可能性のある処理>
rescue => <例外オブジェクトが代入される変数>
<例外が起こった場合の処理>
end
Silver試験では、発生する例外の種類と処理に関しての知識が問われます。
A
論理演算子の評価方法について、&&演算子においては左辺が真と評価されたときのみ右辺も評価されます。同じように||演算子においては、右辺が評価されるのは、左辺が偽と評価された場合です。
C
String#**は定義されていません。 演算子の優先順位は*よりも**が高いため高い 2**2回(4回)"foo"が繰り返される新しい文字列を返します。
C
foo,barは同じ配列オブジェクトを参照しています。
例題と同じ内容で以下のメソッドを実行すると、以下のようになります。
foo.object_id # barと同じ整数値
bar.object_id # fooと同じ整数値
baz.object_id # 上記2つとは違う整数値
C,D
IO#getsとIO#readlineはファイルオブジェクトから一行読み込んで、読み込みに成功した時にはその文字列を返します。IO#getsとIO#readlineの違いはEOFに到達した時の振る舞いのみです。IO#getsはnil, IO#readlineはEOFErrorを返します。
A
String#splitメソッドは引数で指定した特定の文字列を区切り文字として、文字列から配列を生成します。また、第二引数で生成される配列の要素数を指定することもできます。
C
ArrayクラスはObjectクラスを継承しています。Rubyでは組み込みクラスを含め定義済みのクラスに対してメソッドを追加することができます。また追加だけではなく既存のメソッドを書き換えることもできます。
D
\d、または[0-9]は数字を表しています。{m}は直前の正規表現のm回の繰り返しを意味します。
B
C
モードを明示的に指定しない場合、読み込みモード"r"でファイルを開きます。そのため、エラーが発生しています。選択肢Bの場合は、IOErrorではなくErrno::ENOENT(システムコールに依存したエラー)を発生させます。例題では、読み込みモードを"w"として開いた場合のファイルの内容は、Time.nowで得た現在時刻を指定したformat文字列で出力したものになります。(例:2015/06/07)
以下、ファイルオープン時のモード一覧を示します。
"r" 読み込みモード
"w" 書き込みモード。ファイルが存在していればファイルを空にする。
"a" 書き込みモード。ファイルが存在していれば、ファイルの末尾から追記する。
"r+" 読み書き両用モード。ファイルの先頭から読み書きを行う。
"w+" 読み書き両用モード。ファイルが存在していればファイルを空にする。
"a+" 読み書き両用モード。ファイルの末尾から読み書きを行う。
B,D
C
String#deleteメソッドでは引数で指定された文字をselfから取り除きます。
-の両端に文字列がある場合は範囲指定をしていることになります。
例題では"0-5"で0から5までの数字を取り除きますが、続く"8-"では範囲指定とは見なされず、8と-を削除します。
A
String#splitと対になる動作をするものにArray#joinがあります。 例題ではカンマ区切りになっていた文字列を改行区切りの文字列で出力しています。
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
(実行環境によって結果は異なります。)
A
inject (Enumerable)は前回のブロックの戻り値をブロックに渡して繰り返し実行します。 例題では条件演算子を使い、2つの整数値を比較しより大きな値を取り出しそれをブロックに渡しています。
条件演算子(文法) 式1 ? 式1が真だった場合の値 : 式1が偽だった場合の値
A
Enumerable#grepではパターンにマッチする要素を配列にして返します。例題ではStringクラスのインスタンスメソッドで正規表現/strip/の文字列に一致するものを配列で返します。
C
Hashを生成する方法はいくつか存在しますが、例題では{}とHashのクラスメソッド[ ]を使用しています。Bのように、キーにシンボルを使う場合はコロンをハッシュキーの最後につけると矢印を省略して書けます。
A
uriはRubyに標準で添付されているライブラリーの1つです。requireすることによって、プログラム内で呼び出すことができます。include、extendはモジュールを読み込む際に使用します。importはRuby以外の言語で同様の目的の際に利用されることがありますが、Rubyでは使えません。
C
@numと@@numはそれぞれ、インスタンス変数とクラス変数です。クラス変数はクラス定義の中で定義され、クラスの特異メソッド、インスタンスメソッドなどから参照/ 代入ができます。例題ではFooクラスとBarクラスの間で値を共有します。@はインスタンス変数です。インスタンス変数は名前の通り特定のオブジェクトに所属しています。(クラスはclassクラスのオブジェクトのためクラスレベルでのインスタンス変数も存在する)Rubyのオブジェクトモデルをより深く理解したい場合は、Silver合格後にGold試験の受験もおすすめします。
A
Rubyでは、falseとnilは偽、falseとnil以外は全て真として扱われます。
unless false || nilの条件はif !false && !nil(詳細はドモルガンの法則を参照)と同じ意味です。
C
Enumerable#detectメソッドは要素に対してブロックを評価した値が真になった最初の要素を返します。例題では1~20までの数字に対して一番最初の5の倍数を求めていますので正解はCです。Enumerable#findを使っても同様の結果になります。
A
raise関数によって明示的に例外を発生させることができます。例題ではString#ascii_only?を使いテキストにASCII文字以外が使われている場合には例外を発生させています。例外処理の基本形は問題28の解説を参照してください。
A,C
0xAは16進数、012は8進数です。いずれも10進数では10となります。
puts "#{0xA}" => 10
puts '#{012}' => #{012}
ダブルクォーテーション内では式展開されますが、シングルクォーテーションでは式展開が行われません。
本問題集を利用したことによる損害が生じてもRubyアソシエーションはその責任を負いません。