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 "青" => "青"
演算子の優先順位
演算子には優先順位が決められている。 およそ、数学的な順位と変わらない。
配列の代入
代入に関する基本的な考え方が理解できていない。 代入しただけでは、オブジェクトのコピーは行われていない。
あくまで、同じオブジェクトを指し続けていることに注意する必要がある。
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に入るのは最初の要素だけである。