====== 様々なメソッド ====== ここでは講義で取り上げなかったメソッドについて解説する。 ===== 整数の反復構造(ループ) ===== 反復構造(ループ)には ''while...do...end'' や ''for...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'' の違いを見るためのプログラムである。 #!/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 ''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 秒数 ''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回ずつ出力して比較する。 #!/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''」という定数で定義されている。