Programing Language
a,d は、メソッドを呼ぶだけなので割と簡単にできた(筈)
b,c は、StringクラスとArrayクラスを行き来することで解決できることを学んだ
(eについては積み残してある)
String#reverse に相当する動作(文字列の反転)を
reverseを使わずに実現するプログラム例を【別ページ】に示した
以下のような枠組のプログラムから呼び出すことを前提としている。
なお、プログラム中のARGVについては、リファレンスで確認しておいて下さい(右図)。
使える道具は使わせてもらうようにして学習しよう、でも時には中身にも踏み込んでみよう、という発想(たとえばここにも書いてる )をベースにしている。
# 練習1
# rev.rb というプログラム
# 使い方:
# > rev hello
# olleh
# コマンドパラメータで
# 渡した文字を
# 反転して表示
# コマンドパラメータ(の1つめ)は ARGV[0]
s = ARGV[0]
# または s = (ARGV[0] || "abc")
puts s.reverse # でも動作するが
# reverse使わずに
# やってみよう => 別ページ参照
このプログラムは(rev.rbという名前で保存したとして)以下のように動作することを前提としている。
C:\Users\xxx\Document\some\folder> rev.rb abcdefg
gfedcba
(パラメータとして渡した文字列を、逆転した文字列が表示される)
self * x
と書かれていれば100 * 10
のような式では、*
は演算子として認識されているが、*
を呼び出し、 引数 10
を渡したものとして(Ruby内部では)実行される。*
メソッドを、演算子ふうでない記法として 10.*(10) と書いても、
同じ動作をする。ブロックを後ろにともなって呼び出されるようなメソッドが多数ある
マニュアルで うしろに { ~ } あるいは { |…| ~ }
が書かれているメソッドがそれで、
| … | の間は 仮引数 (呼び出すときに省略することは可)
たとえば、
3.times {|i| print i end}
# または、
3.times do |i| print i end
# のようにブロックを do ~ end で囲んでもいい
という式は、
Cだと | for(i=0 ; i<3 ; i++) | |
VBだと | for i = 0 to 2 |
のようなループと同等
{ … } で囲むブロックと、do … end で囲むブロックは、意味としては(ほぼ)同じ。 (違いを意識する必要があるケースと、普段の使い分け方(のガイドライン)は、 このページが参考になる だろう)。
入力した行を 単語に分けて、それを逆順にして出力させる
例:
this is a pen -> pen a is this
プログラム例 ( s に入力された文字列が入ってるとして)
s.split(' ').reverse.join(' ')
e 各文字を3つずつ重ねて出力
例:
hello -> hhheeellllllooo
| |
で囲んで置かれたブロック変数である。 (以下のように進めていく)
s="hello"
s.split(//)
s.split(//).map{|c|c*3}
(各自完成させてみて下さい)
"\n"
と '\n'
は違うものになる条件分岐に関して、if式
if ... then ... else ... end
に代わって、
... ? ... : ...
という記法も使える(条件演算子)
プログラムの中では
例
a = [1,2,4,8,16,32]
p a[2..4] => [4,8,16]
マニュアルの中(メソッドの呼び出し方、引数の解説の部分)では 省略可能な部分
例
Array.new([size[, val]])
外側のブラケット:引数全体を省略できる(引数なしで呼ぶ)
内側のブラケット:第二引数だけを省略することもできる
文書の中では(これはいろいろあるが)
[1,2,3]*3
と [1,2,3]*' '
はまったく違う意味になる。実は、先に別ページで提示した「reverse的メソッド」の考え方Ⅰのプログラム例には、
右図のようなパターン(rubyでは多重代入。他の言語では分割代入、平行代入などの呼び方がある)
のコードが含まれている。
これは最近の言語で普及してきた機能で、 このパターンで2つの値を1つの =
記号で交換することができる
(前回の待避線に喩えた解説は実際には古い言語での常識という話であった)。