Ruby問題集から。
sliceメソッドを使って作成するのですが、今回ピックアップしたいのは模範解答にあるlengthメソッドについての所感というか愚痴というか私の知識不足の露呈というかをつらつら書いていきます。
まずは構成から。
問題
以下の要件を満たすextra_endメソッドを実装しましょう。
・対象の文字列から末尾にある2文字を取得すること
・取得した2文字を3回繰り返して出力すること
【ヒント】
# 配列を作成します
array = [0,1,2,3,4,5,6]
# 配列から引数で指定した要素を取得します
ele1 = array.slice(1)
puts ele1
# => 1
# 配列番号-4から4つ分の要素をsliceします
ele2 = array.slice(-4,4)
puts ele2
# => 3, 4, 5, 6
# 配列はもとのままです
puts array
# => [0,1,2,3,4,5,6]
この段階で末尾の文字列 = ヒントに記載されている3つ目の'配列番号-4から〜'あたりを使用するのかなと。
ここで模範解答と私の回答を並べてみます。
〜模範解答〜
def extra_end(str)
char_num = str.length
right2 = str.slice(char_num - 2, 2)
puts right2 * 3
end
〜私の回答〜
def extra_end(str)
num = str.slice(- 2, 2)
puts num * 3
end
メソッドの実行結果は同じなんですよ。(私の記述の方が可読性た...)
ここで模範解答の解説文を見ると、、、
extra_end('Hello')でメソッドを呼び出した場合の解説をします。
まず、1行目のextra_endメソッドの仮引数strには対象の文字列’Hello’が格納されます。
そして、2行目ではstrに対してsliceメソッドを使用し、指定した要素を取り出しています。
sliceメソッドの1つ目の引数では、文字列(Hello)の後ろから2番目の要素を基準点としています。
そして、2つ目の引数により、基準点から2つ分の要素を取り出しています。
今回の場合、「H,e,l,l,o」の後ろから2番目の要素は「l」です。そして、基準点「l」から2つ分の要素である「lo」が取り出されるので、end_str = loとなります。
最後に、2 * 3と記述することによって、「lololo」と出力されます。
、、、lengthメソッドいります?
そもそも記述方法は多様にあることを理解した上で、lengthメソッドいります?
今回の問題文では「末尾の文字列を3回」と記述があり、【ヒント】にはsliceメソッドにて配列番号後ろから指定する記述もあり、解説文では「sliceメソッドの1つ目の引数では、文字列(Hello)の"後ろから2番目の要素を基準点"としています。」と書かれております。
lengthメソッド定義してわざわざ代入して(char_num -2, 2)ってhelloの場合(3, 2)ってなるわけでこれ前から3番目ですやん!!!
5文字中の前から3番目も後ろから2番目も同じだけども!!!
今回に限り私のコードの方が可読性た、、、っ!!!
はい。というわけで実行結果は同じでも、sliceメソッドでは文字列に対するアプローチがコードによって前からなのか後ろからなのか変わる会でした。()
以上