様々なメソッド

ここでは講義で取り上げなかったメソッドについて解説する。

整数の反復構造(ループ)

反復構造(ループ)には while…do…endfor…in…do…end などがあるが、 簡単な場合に使いやすい整数(Integer)を使ったメソッドがある。


times

オブジェクト.times do |変数|
  変数を使った処理
end

times メソッドは 0 から「オブジェクトが持つ整数-1」まで1 ずつ増やした整数を順に変数に代入しながら処理を行うメソッドである。


upto

オブジェクト.upto(max) do |変数|
  変数を使った処理
end

upto メソッドは「オブジェクトが持つ整数-1」から max まで1 ずつ増やした整数を順に変数に代入しながら処理を行うメソッドである。


downto

オブジェクト.downto(min) do |変数|
  変数を使った処理
end

downto メソッドは「オブジェクトが持つ整数-1」から min まで1 ずつ減らした整数を順に変数に代入しながら処理を行うメソッドである。

次のプログラム loopint.rb は times, upto, downto の違いを見るためのプログラムである。

loopint.rb
  1. #!/usr/koeki/bin/ruby
  2. # -*- coding: utf-8 -*-
  3.  
  4. x = 5
  5.  
  6. # 0 から x-1 まで 1 ずつ増やした整数を順に y に代入して処理
  7. print "times :"
  8. x.times do |y|
  9. printf(" %d", y)
  10. end
  11. print "\n"
  12.  
  13. # x から 10 まで 1 ずつ増やした整数を順に y に代入して処理
  14. print "upto :"
  15. x.upto(10) do |y|
  16. printf(" %d", y)
  17. end
  18. print "\n"
  19.  
  20. # x から 2 まで 1 ずつ減らした整数を順に y に代入して処理
  21. print "downto:"
  22. x.downto(2) do |y|
  23. printf(" %d", y)
  24. end
  25. print "\n"

実行結果

times : 0 1 2 3 4
upto  : 5 6 7 8 9 10
downto: 5 4 3 2

時間のメソッド

Time.now

変数 = Time.now

Time.now メソッドは現在の時刻を返す。

to_i メソッドや to_f メソッドを使うと起算時からの経過秒数に変換できる。 起算時は協定世界時(UTC)の 1970年1月1日午前0時である。

第5回で使用した実行速度を測定するためのプログラム count.rb を Time.now を使って書き換えると次のプログラム count2.rb のようになる。

count2.rb
  1. #!/usr/koeki/bin/ruby
  2. # -*- coding: utf-8 -*-
  3.  
  4. puts "VERSION:" + RUBY_VERSION
  5. puts "PLATFORM:" + RUBY_PLATFORM
  6.  
  7. start_time = Time.now.to_f
  8. x = 0
  9. while x < 10000000
  10. x += 1
  11. end
  12. puts "x=" + x.to_s
  13. printf("処理時間 %f秒\n", Time.now.to_f - start_time)

sleep

sleep 秒数

sleep メソッドは引数の秒数だけ実行停止する。 引数を小数にすると1秒以下の単位も指定できる。

乱数のメソッド

rand

変数 = 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回ずつ出力して比較する。

rand.rb
  1. #!/usr/koeki/bin/ruby
  2. # -*- coding: utf-8 -*-
  3.  
  4. # seed を設定しないと毎回違う種が作られるので毎回異なる乱数列になる
  5. srand
  6. puts "seed 設定なし"
  7. 3.times do |x|
  8. puts rand(10)
  9. end
  10.  
  11. puts
  12.  
  13. # seed に数字を設定すると、それを元に乱数列が作られるので同じ乱数列になる
  14. seed = 351
  15. srand(seed)
  16. printf("seed = %d\n", seed)
  17. 3.times do |x|
  18. puts rand(10)
  19. end

このプログラムを何度か実行して作られる乱数列を比較してみてほしい。

文字列のメソッド

文字列の置換

gsub, sub メソッドでは正規表現を使って文字列の置換を行うことができる。

置換元の文字列.gsub(正規表現, 置換文字列)

gsubメソッドは「置換元の文字列」の中で「正規表現」にマッチした文字列すべてを「置換文字列」で置換する。

置換元の文字列.sub(正規表現, 置換文字列)

subメソッドは「置換元の文字列」の中で「正規表現」に最初にマッチした文字列だけを「置換文字列」で置換する。

メソッドの最後に「!」を付けると破壊的メソッドになる。

次のプログラム strsub.rb は文字列 “ぷよぷよ” を置換する。

strsub.rb
  1. #!/usr/koeki/bin/ruby
  2. # -*- coding: utf-8 -*-
  3.  
  4. str = "ぷよぷよ"
  5.  
  6. puts "original: " + str
  7. puts "gsub : " + str.gsub(/ぷよ/, "なぞ")
  8. puts "sub : " + str.sub(/ぷよ/, "なぞ")

実行結果

original: ぷよぷよ
gsub    : なぞなぞ
sub     : なぞぷよ

大文字と小文字の変換

メソッド 機能
upcase 文字列中のアルファベットの小文字を大文字に変換する。
downcase 文字列中のアルファベットの大文字を小文字に変換する。
capitalize 文字列の先頭文字がアルファベットの小文字の場合に先頭文字のみ大文字に変換する。
swapcase 文字列中のアルファベットの大文字と小文字を入れ替える。

メソッドの最後に「!」を付けると破壊的メソッドになる。

次のプログラム alphabet.rb は文字列 “go to USA!” を各メソッドで変換する。

alphabet.rb
  1. #!/usr/koeki/bin/ruby
  2. # -*- coding: utf-8 -*-
  3.  
  4. str = "go to USA!"
  5.  
  6. puts "original : " + str
  7. puts "upcase : " + str.upcase
  8. puts "downcase : " + str.downcase
  9. puts "capitalize: " + str.capitalize
  10. 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」という定数で定義されている。