Ruby Tips!

RubyのTipsを紹介します

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(申 酉 戌 亥 子 丑 寅 卯 辰 巳…

Rubyのデバッガを使う

以下のように-r debugオプションを付けてRubyスクリプトを実行するとデバッガでRubyスクリプトをデバッグすることができる。 ruby -r debug foo.rb デバッガの主なコマンドは以下のとおり。 コマンド 意味 step 1行実行する、メソッド呼び出しがある場合はそ…

Rubyをデバッグモードで実行する

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のブロックについて

Rubyのメソッド呼び出し時には、ブロックというコードの塊を渡すことができる。メソッドにブロックを渡すにはdo endまたは{ }を使う。 オブジェクト.メソッド do |ブロックパラメータ| # ブロック endオブジェクト.メソッド{|ブロックパラメータ| # ブロック…