hello を入力した場合の出力例を示す
a 左右ひっくり返す | olleh |
b 一文字一文字区切る | h e l l o |
c 3回繰り返す | hello hello hello |
d 大文字にする | HELLO |
e 各文字を3つずつ重ね | hhheeellllllooo |
(while で囲むループ は 適宜省略して $_
に対する処理のみ示す)
いずれも $_ に対して メソッド呼び出しをしています
リファレンスマニュアル、組み込みクラスの中の、 String クラスのページにヒントが隠れています。
a $_.reverse
b # => 後ほど
c の 惜しい解答
$_.chop * 3 # chopについては後述
# これだと 3つがくっついて hellohellohello になる
d $_.upcase
e # あとで考えましょう
Case の意味についてはたとえばここに解説あり
getsで読み込んだ文字列($_
)は末尾に行末文字(補足として後述)が入っているので、
$_.chop
を対象に以下の加工を行うといい。
* 行末文字が入ったまま、例えば reverseメソッドを呼ぶと、 右図のように行末文字が文字列の先頭に入ったものができる。
puts gets
できていた裏側の事情であった。
本章では、読み込んだ文字列(に、chopをしたもの)を加工する手立てを考える。
そのため、本章では加工する部分だけを扱い、文字列を読んだり書いたりする部分と、
繰り返しを制御する部分は省略している。
右図を参考に、本章で扱うプログラムは緑線で囲んだ部分の書き方である
と理解した上で使って下さい。
なお、chop という単語は、chopping board、空手チョップ といった検索で意味をイメージしてみて下さい。
b について:
以下では課題cについて様々な方法を考察する。
課題c:読んだ文字列を 3回リピート
*ex.* hello → hello hello hello
3.times do … という構文が使える
3 は Integer(整数)クラスのインスタンス
Integer#times
は その メソッド
正確には、3.class => FixNum が返ってくるが、
クラス階層図(右図がその一部)でFixNumの上位(親クラス)にIntegerがあり、
親クラスのメソッドを継承して使える。
現在は 3 は Integerクラス(FixNumおよびBigNumは Integerに統合され、2.4版以降はIntegerの単なる別名になった)。
プログラム例:
while gets do
3.times { puts $_}
end
puts 以外の 出力メソッドを探す
たとえば print を使う
読みこんだ文字列 $_ の末尾に付加されている、
改行文字 “” を 切り落としておく
=> chop メソッドを使う(Stringクラスのメソッド)
3.times {print $_.chop}
最後に改行させる
puts (だけ) または print “”
間にスペースをいれて3回リピート する:
例(中身だけ)
3.times { print $_.chop+' '} ; puts
最後の(改行の直前の)スペースは不要 だと考えると、
while gets do
3.times { |i|
if i < 2 then
print $_.chop+" "
else
print $_.chop
end
}
puts
end # と、ずいぶん長くなってしまう
while gets do
puts Array.new(3,$_.chop).join(' ')
# ([$_.chop]*3).join(' ') や
# [$_.chop]*3*' ' でもいい
end
ここでチェックすべき文法要素: