ここでは講義で取り上げなかったメソッドについて解説する。
反復構造(ループ)には while…do…end
や for…in…do…end
などがあるが、
簡単な場合に使いやすい整数(Integer)を使ったメソッドがある。
オブジェクト.times do |変数| 変数を使った処理 end
times
メソッドは 0 から「オブジェクトが持つ整数-1」まで1 ずつ増やした整数を順に変数に代入しながら処理を行うメソッドである。
オブジェクト.upto(max) do |変数| 変数を使った処理 end
upto
メソッドは「オブジェクトが持つ整数-1」から max まで1 ずつ増やした整数を順に変数に代入しながら処理を行うメソッドである。
オブジェクト.downto(min) do |変数| 変数を使った処理 end
downto
メソッドは「オブジェクトが持つ整数-1」から min まで1 ずつ減らした整数を順に変数に代入しながら処理を行うメソッドである。
次のプログラム loopint.rb は times
, upto
, downto
の違いを見るためのプログラムである。
#!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- x = 5 # 0 から x-1 まで 1 ずつ増やした整数を順に y に代入して処理 print "times :" x.times do |y| printf(" %d", y) end print "\n" # x から 10 まで 1 ずつ増やした整数を順に y に代入して処理 print "upto :" x.upto(10) do |y| printf(" %d", y) end print "\n" # x から 2 まで 1 ずつ減らした整数を順に y に代入して処理 print "downto:" x.downto(2) do |y| printf(" %d", y) end print "\n"
実行結果
times : 0 1 2 3 4 upto : 5 6 7 8 9 10 downto: 5 4 3 2
変数 = Time.now
Time.now
メソッドは現在の時刻を返す。
to_i
メソッドや to_f
メソッドを使うと起算時からの経過秒数に変換できる。
起算時は協定世界時(UTC)の 1970年1月1日午前0時である。
第5回で使用した実行速度を測定するためのプログラム count.rb を Time.now を使って書き換えると次のプログラム count2.rb のようになる。
#!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- puts "VERSION:" + RUBY_VERSION puts "PLATFORM:" + RUBY_PLATFORM start_time = Time.now.to_f x = 0 while x < 10000000 x += 1 end puts "x=" + x.to_s printf("処理時間 %f秒\n", Time.now.to_f - start_time)
sleep 秒数
sleep
メソッドは引数の秒数だけ実行停止する。
引数を小数にすると1秒以下の単位も指定できる。
変数 = rand
rand
メソッドは引数がなければ 0 以上 1未満の一様な実数の乱数を返す。
変数 = rand(max)
引数 max
を整数で与えると 0 以上 max
未満の整数の乱数を返す。
max
が実数なら小数点以下を切り捨てた整数の引数とみなされる。
変数 = rand(範囲)
引数を範囲で与えるとその範囲の乱数を返す。
例えば
x = rand(3)
ならば、x
には 3 未満の 0, 1, 2 の数字のどれかが代入され、乱数なので実行する度に代入される数字は変わる。
y = rand(3..8)
ならば、y
には 3以上 8以下の 3, 4, 5, 6, 7, 8 のどれかが代入される。
コンピュータでは理想的な乱数(次に何が出るか予想できない)を作ることができない。
rand
メソッドで返ってくる乱数は計算で求められた擬似的な乱数(疑似乱数)である。
疑似乱数では、srand
で乱数の種(seed)を与えることができる。
srand(seed)
乱数の種は疑似乱数の列を計算するときに元となる数字で、種が同じであれば計算される疑似乱数の列は同じになる。 seed を省略すると現在の時刻などを元に種が作られる。
次のプログラム rand.rb は seed なしと seed ありで乱数を3回ずつ出力して比較する。
#!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- # seed を設定しないと毎回違う種が作られるので毎回異なる乱数列になる srand puts "seed 設定なし" 3.times do |x| puts rand(10) end puts # seed に数字を設定すると、それを元に乱数列が作られるので同じ乱数列になる seed = 351 srand(seed) printf("seed = %d\n", seed) 3.times do |x| puts rand(10) end
このプログラムを何度か実行して作られる乱数列を比較してみてほしい。
gsub
, sub
メソッドでは正規表現を使って文字列の置換を行うことができる。
置換元の文字列.gsub(正規表現, 置換文字列)
gsub
メソッドは「置換元の文字列」の中で「正規表現」にマッチした文字列すべてを「置換文字列」で置換する。
置換元の文字列.sub(正規表現, 置換文字列)
sub
メソッドは「置換元の文字列」の中で「正規表現」に最初にマッチした文字列だけを「置換文字列」で置換する。
メソッドの最後に「!
」を付けると破壊的メソッドになる。
次のプログラム strsub.rb は文字列 “ぷよぷよ” を置換する。
#!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- str = "ぷよぷよ" puts "original: " + str puts "gsub : " + str.gsub(/ぷよ/, "なぞ") puts "sub : " + str.sub(/ぷよ/, "なぞ")
実行結果
original: ぷよぷよ gsub : なぞなぞ sub : なぞぷよ
メソッド | 機能 |
---|---|
upcase | 文字列中のアルファベットの小文字を大文字に変換する。 |
downcase | 文字列中のアルファベットの大文字を小文字に変換する。 |
capitalize | 文字列の先頭文字がアルファベットの小文字の場合に先頭文字のみ大文字に変換する。 |
swapcase | 文字列中のアルファベットの大文字と小文字を入れ替える。 |
メソッドの最後に「!
」を付けると破壊的メソッドになる。
次のプログラム alphabet.rb は文字列 “go to USA!” を各メソッドで変換する。
#!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- str = "go to USA!" puts "original : " + str puts "upcase : " + str.upcase puts "downcase : " + str.downcase puts "capitalize: " + str.capitalize puts "swapcase : " + str.swapcase
実行結果
original : go to USA! upcase : GO TO USA! downcase : go to usa! capitalize: Go to usa! swapcase : GO TO usa!
数学関数 | 機能 |
---|---|
Math.sqrt(x) | x の平方根 |
Math.cos(x) | x の cos関数 |
Math.sin(x) | x の sin関数 |
Math.tan(x) | x の tan関数 |
Math.acos(x) | x の arccos関数 |
Math.asin(x) | x の arcsin関数 |
Math.atan2(x,y) | x/y の arctan関数 |
Math.exp(x) | x の指数関数 |
Math.log(x) | x の自然対数 |
Math.log10(x) | x の常用対数 |
ちなみに円周率 $\pi=3.1415\cdots$ は「Math::PI
」という定数で定義されている。