Ruby silver模擬試験誤答一覧

随時追加。

引数をフォーマットした文字列

irb(main):002:0> p "HelloWorld%d" % 5
"HelloWorld5"
=> "HelloWorld5"

module function Kernel.#format (Ruby 2.1.0)

Cのpritntfのように、引数を指定しておいて、後ろから置換する文字をしてする記法が使える。#{}の代わりになりうるが、型を指定しなくてはならないので、あまり実用性はなさそうだ。

irb(main):004:0> p "%s君はRubySilverの試験をうけた" % "たなか"
"たなか君はRubySilverの試験をうけた"
=> "たなか君はRubySilverの試験をうけた"

Stringクラスにto_aはない

Stringクラスに定義された、他のクラスへの変換用メソッドは以下の通り

hex
oct
to_f
to_i
to_sym #internのエイリアス

do~endとブロックはエイリアスの関係ではない

ブロックをdo…endで書くか{…}で書くかにより挙動が変わる例 - Qiita

do ~ endより、ブロックの方が結合度が強い。

irb(main):005:0> p [1,2,4,5].map do |x| p x end
#<Enumerator: [1, 2, 4, 5]:map>
=> #<Enumerator: [1, 2, 4, 5]:map>
irb(main):006:0> p [1,2,4,5].map
#<Enumerator: [1, 2, 4, 5]:map>
=> #<Enumerator: [1, 2, 4, 5]:map>

結合度が弱いため、do以降が無視されてしまう。 これをブロックで書き直すと、

irb(main):007:0> p [1,2,4,5].map{|x| p x }
1
2
4
5
[1, 2, 4, 5]

これは、あえてdo-endを使う理由があるのだろうか。。。

メソッド名と引数の間の空白の有無で挙動が変わる。

def hello(var)
    p var * 10
end

hello(10) * 4 #100
hello (10) * 4 # 400

メソッドと引数の間に空白があると、その引数と後ろにある処理が先に行われる。 空白なしで引数を指定すると、先にメソッドの処理から行われる。

これで挙動が変わってしまうのは、相当可読性を下げるため、空白を入れたメソッド指定はやめたほうがよさそうだ。

メソッドと変数の探索順位

オブジェクト指向の章でメソッドの探索順位は扱った気がするけど、これはどうだったかな。。。 探索順位はまず「変数」らしい。

unlessにelsifはない。

ヘビーunlessユーザーだったが、知らなかった。

ruby unless文にelsifはないよ。。。 - Qiita

メソッドチェーンで改行するには/で改行すればよい。

irbだとエラーが出てしまうらしい。解かないと仕入れようのない知識だ...

p "Sailing".reverse.\
reverse.\
reverse

マッチした文字列の取り出し

irb(main):005:0> p = /Pascal/
=> /Pascal/      
irb(main):006:0> "I think Pascal is not a famous language but still lovely language to use."
=> "I think Pascal is not a famous language but still lovely language to use."
irb(main):007:0> "I think Pascal is not a famous language but still lovely language to use." =~ p
=> 8
irb(main):008:0> $&
=> "Pascal"      
irb(main):009:0> $'
=> " is not a famous language but still lovely language to use."
irb(main):010:0> $`
=> "I think "

行頭・行末指定はそれぞれ、^$

Stringにメソッドserchはない。

というか、どうやらserchというメソッドはRubyの組み込みライブラリにはどこにも定義されていない模様。

文字列の中の検索は原則「match,scan,index」くらい。

rubyはてなマークの意味

C言語とかのcharと同じ。一文字のStringの意味。 このほかにもコントロールキーとのバインドなども表すことが出来る。

Ctrl + n とか Alt + nとかにもちゃんと文字コードが割り振ってあって、Rubyはそうした入力のキー判定も行えちゃう。

Ruby Silver試験対策 Day1 - Pyons Tech Blog
irb(main):039:0> a = ?青
=> ""
irb(main):040:0> p a
""
=> ""

演算子の優先順位

演算子には優先順位が決められている。 およそ、数学的な順位と変わらない。

演算子式 (Ruby 2.6.0)

配列の代入

代入に関する基本的な考え方が理解できていない。 代入しただけでは、オブジェクトのコピーは行われていない。

あくまで、同じオブジェクトを指し続けていることに注意する必要がある。

irb(main):043:0> a = "HelloWorld"
=> "HelloWorld"
irb(main):044:0> b = a
=> "HelloWorld"
irb(main):045:0> b.object_id
=> 70368227025380
irb(main):046:0> a.object_id
=> 70368227025380
irb(main):047:0> b.slice!("H")
=> "H"
irb(main):048:0> p b
"elloWorld"
=> "elloWorld"
irb(main):049:0> p a
"elloWorld"
=> "elloWorld"

inject メソッドの動き

numbers = [3,40,39,29,10,50,89,59,69]

numbers.inject do |i,j|
    puts "-------------------------"
    puts "i is #{i}"
    puts "j is #{j}"
    return_num = i > j ? i : j
    puts "#{return_num} is returned"
    puts "-------------------------"
    return_num = i > j ? i : j
end
pyons@LAPTOP-SF87NLCB:/mnt/c/Users/broad/OneDrive/products/Ruby技術者認定試験$ ruby 5-1-1.rb 
-------------------------
i is 3
j is 89
89 is returned
-------------------------
-------------------------
i is 89
j is 40
89 is returned
-------------------------
-------------------------
i is 89
j is 39
89 is returned
-------------------------
-------------------------
i is 89
j is 29
89 is returned
-------------------------
-------------------------
i is 89
j is 10
89 is returned
-------------------------
-------------------------
i is 89
j is 50
89 is returned
-------------------------
-------------------------
i is 89
j is 59
89 is returned
-------------------------
-------------------------
i is 89
j is 69
89 is returned
-------------------------

injectに引数が指定されていないため、最初のiは配列の先頭である3である。しかし、次にiに設定されるのは、前回の処理の返り値89であり、以降iにはその処理の返り値であり続ける89がセットされる。

最後の処理も89が返り値として返却される。

ASCIIで日本語は書けない

instance method String#ascii_only? (Ruby 2.6.0)

a, = (1..5).partition(&:odd?)

全然知らない記法ばかりなのでビビる。

参考: Rubyのmap(&:name)というのはどういう意味? - QA@IT

partitionメソッド自体が教科書では扱われていないが、これはEnumeratable moduleのメソッドで、「ブロックの条件を満たすようなオブジェクトと満たさないようなオブジェクトに分けた配列を返す。」らしい。

instance method Enumerable#partition (Ruby 2.6.0)

でも、ブロック記法は使われていないので、Enumerator Objectがとりあえず、返る。

&は「ブロックの代わりにProcオブジェクトを渡せる。」というやつで、おそらく、返却されたEnumerator modulesそのものが、Procオブジェクトなのだろう。(?)

更に「シンボルオブジェクト」には、指定したメソッド名の処理をProcオブジェクト内で実行する、というメソッドがあり、これを使ってProc内 でメソッド「odd?」を実行している。

instance method Symbol#to_proc (Ruby 2.6.0)

最後に代入の左辺では、多重代入を使って、2番めの要素を切り捨てている。変数aに入るのは最初の要素だけである。