2014-03-31から1日間の記事一覧
オブジェクトにメソッドが存在するか調べる オブジェクトにメソッドが存在するか調べるには、Object#respond_to?を使う。 class Clazz def foo; end end obj = Clazz.new p obj.respond_to?(:foo) #=> true p obj.respond_to?(:bar) #=> false クラスにメソ…
西暦から干支を求めるメソッドはRubyに用意されていない。 西暦から干支を求めるには、以下のように変換用の配列を定義してやると良い。 この配列は西暦を12で割った余りで干支が求まるようにしている。 EarthlyBranches = %w(申 酉 戌 亥 子 丑 寅 卯 辰 巳…
以下のように-r debugオプションを付けてRubyスクリプトを実行するとデバッガでRubyスクリプトをデバッグすることができる。 ruby -r debug foo.rb デバッガの主なコマンドは以下のとおり。 コマンド 意味 step 1行実行する、メソッド呼び出しがある場合はそ…
Rubyに-dオプションを与えると、Rubyインタプリタをデバッグモードで実行することができる。 ruby -d foo.rb デバッグモードで実行されたインタプリタでは、グローバル変数$DEBUGがtrueとなり、以下の挙動が通常モードとは異なる。 スレッドが例外で終了した…
Rubyで配列を逆順にするにはArray#reverseを使う。 Array#reverseは配列を逆順にした新しい配列を返す。 p [1, 2, 3].reverse #=> [3, 2, 1] 配列を破壊的に逆順にするにはArray#reverse!を使う。 a = [1, 2, 3] a.reverse! p a #=> [3, 2, 1] また配列を逆…
Rubyでべき乗を求めるにはNumeric#**を使う。 p 2 ** 8 #=> 256 複素数を表すComplexや、行列を表すMatrixクラスに対しても**が利用できる。 require 'complex' p Complex(1, 2) ** Complex(3, 4) #=> (0.129009594074467+0.03392409290517014i) require 'ma…
Rubyでハッシュのキーと値を入れ替えるにはHash#invertメソッドを利用する。 h = {:a => 1, :b => 2, :c => 2, :d => 3} p h.invert #=> {1=>:a, 2=>:c, 3=>:d} Hash#invertでは、同じ値を持つ要素があった場合、1つしか残らないことに注意。 値を配列で保持…
Rubyで文字列を行に分割して処理するにはString#each、String#linesまたはString#each_linesが利用できる。これらのメソッドは、ブロックなしで呼び出されると、文字列を行ごとに分割するEnumerable::Enumeratorオブジェクトを返す。例えば文字列を行ごとに…
Rubyで配列をランダムにソートするには、Array#shuffleが利用できる。 Array#shuffleは配列をランダムにソートした新しい配列を返す。 破壊的に配列をランダムにソートするにはArray#shuffle!を使用する。 a = [1, 2, 3, 4, 5] p a.shuffle #=> [2, 4, 1, 5,…
ファイルのロックには共有ロックと排他ロックがある。共有ロックは主に読み込み時に使用し、排他ロックは主に書き込み時に使用する。RubyでファイルをロックするにはFile#flockを使う。共有ロックを行うにはFile::LOCK_SHを、排他ロックを行うにはFile::LOCK…
Ruby 1.8.6以前では配列の要素をランダムに取得するメソッドは存在しない。 Array#lengthとrandを使って以下のようにする。 a = [1, 2, 3, 4, 5] p a[rand(a.length)] #=> 2 Ruby 1.8.7とRuby1.9.0ではArray#choiceが利用できる。 a = [1, 2, 3, 4, 5] a.cho…
Rubyのメソッド呼び出し時には、ブロックというコードの塊を渡すことができる。メソッドにブロックを渡すにはdo endまたは{ }を使う。 オブジェクト.メソッド do |ブロックパラメータ| # ブロック endオブジェクト.メソッド{|ブロックパラメータ| # ブロック…