Ruby Tips!

RubyのTipsを紹介します

2014-03-01から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オブジェクト.メソッド{|ブロックパラメータ| # ブロック…

ビット演算を行う

Rubyでビット演算を行う演算子には以下がある。 演算子 意味 ~(単項) ビット反転 & 論理積 | 論理和 ^ 排他的論理和 >> 右ビットシフト 左ビットシフト 以下はビット演算の例である。 ビットの表示には数値を2進数で整形して表示する - Ruby Tips!の方法を使…

数値からビット列を得る

整数からビット列を得るにはInteger#[]を使う。Integer#[]には最下位ビットを0番目とする添字を指定する。以下は整数からビット列を得る例である。 int = 0b10110101 p int[0] #=> 1 p int[1] #=> 0 p int[2] #=> 1 p int[3] #=> 0 p int[4] #=> 1 p int[5] …

数値を2進数で整形して表示する

数値を2進数で整形して表示するには、Kernel.#printにフォーマット%bを渡すと良い。以下は数値の下位1バイトを2進数で整形して表示する例である。 printf("%08b\n", 1986 & 0b11111111) #=> 11000010 フォーマット%08bは数値を2進数で8桁で0パディングして整…

文字から文字コードを得る / 文字コードから文字を得る

文字から文字コードを得る Ruby 1.8ではString#[]で文字列から1バイト抜き出し文字コードを得ることができる。 p "a"[0] #=> 97 p "あ"[0] #=> 227 p "あ"[1] #=> 129 p "あ"[2] #=> 130 非マルチバイト文字であれば?リテラルで文字コードを得ることもできる…

月末の日付を得る

Date.newの第3引数に負の値を指定すると、月末からの日付でDateオブジェクトを初期化できる。-1を指定すれば、月末の日付を得ることができる。 require 'date' p Date.new(2014, 1, -1) #=> #<Date: 2014-01-31 ((2456689j,0s,0n),+0s,2299161j)> p Date.new(2014, 2, -1) #=> #<Date: 2014-02-28 ((2456717j,0s,0n),+0s,2299161j)> p Date.new(2014, 3, -1) #=> #</date:></date:>

コマンドライン引数を使う

Rubyスクリプトに対するコマンドライン引数はARGVという定数に格納される。ARGVは配列である。Ruby自身への引数はこの配列には含まれない。例えば以下のように呼び出したRubyスクリプトでは、 ruby -Ku script.rb foo bar buz定数ARGVの内容は以下のようにな…

Rubyの制御構造 繰り返し

ある条件が満たされている間、繰り返しを行うにはwhile文を使う。doは省略できる。 while 条件 do 処理 end 逆にある条件が満たされてるまで、繰り返しを行うにはuntil文を使う。doは省略できる。 until 条件 do 処理 end for文は式を評価した結果の各要素を…

モジュール関数を定義する

モジュールのプライベートメソッドであり、特異メソッドであるメソッドのことをモジュール関数と呼ぶ。モジュール関数はモジュール名.モジュール関数の形で呼び出すことができる。例えばMathモジュールのメソッドはすべてモジュール関数である。モジュール関…

配列やハッシュの内容を表示する

配列やハッシュはinspectメソッドで人間が読める形式で文字列化することができる。 a = [1, 2, 3] h = {a:1, b:2} puts a.inspect #=> [1, 2, 3] puts h.inspect #=> {:a=>1, :b=>2} pは内部でオブジェクトをinspectするためデバッグに便利である。 a = [1, …

配列の数値の総和を求める

配列の数値の総和を求める処理は、Array#injectメソッドを使って以下のように書ける。 p [1, 2, 3, 4, 5].inject(:+) #=> 15

数値をカンマ区切りで整形する

数値を3桁ずつカンマで区切って整形するには、数値をいったん文字列に変換した上で、String#gsubで正規表現による置換を行えば良い。以下はこの方法で数値をカンマ区切りで整形する例である。 num = 1234567890 p num.to_s.gsub(/(\d)(?=\d{3}+$)/, '\\1,') …

文字列を単語に分割する

文字列を単語に分割するにはStging#splitメソッドが利用できる。 p "foo bar buz".split #=> ["foo", "bar", "buz"] Stging#splitメソッドは引数にスプリッタを取るが、スプリッタが空文字列''かnilの場合は、文字列の前後の空白文字を除去して空白文字をス…

evalでスタックトレースのファイル名と行番号を差し替える

Kernel.#eval、Module#module_eval、BasicObject#instance_evalでは引数にファイル名と行番号を与えることで、スタックトレースのファイル名と行番号を差し替えることができる。以下は文字列がtest.rbの100行目に書かれているかのようにスタックトレースを表…

ワイルドカードにマッチするパスの一覧を取得する

Dir.globを使えばシェル風のワイルドカードにマッチしたパスの一覧を取得することができる。Dir.globで指定できるワイルドカードには以下がある。 ワイルドカード 意味 * 任意の文字列 ? 任意の1文字 [] 括弧内のいずれかの文字 {} 括弧内の文字の組み合わせ…

無名関数を生成する

Rubyにおける無名関数の正体はProcオブジェクトである。Procオブジェクトの生成には、kernel#.lambda、Kernel#.procまたはProc.newを使う。ProcオブジェクトはProc#callで呼び出して使うことができる。以下は2つの引数を取り、それらを加算する無名関数を生…

パスからディレクトリ名、ファイル名、ファイルの拡張子を得る

パスからディレクトリ名を得るにはFile.dirnameを使う。 p File.dirname("/home/rubytips86/foo.rb") #=> "/home/rubytips86" パスからファイル名を得るにはFile.basenameを使う。 p File.basename("/home/rubytips86/foo.rb") #=> "foo.rb" パスからファイ…

携帯メールアドレスのキャリアを判別する

jpmobileライブラリを使えば携帯のメールアドレスからキャリアを判別することができる。jpmobileライブラリはgemから以下のようにインストールできる。 gem install jpmobile携帯メールアドレスからキャリアを判別するには、Jpmobile::Email.detectメソッド…

メールアドレスの妥当性を正規表現でチェックする

ある文字列がメールアドレスか妥当かをチェックしたい場合は、以下の正規表現が利用できる。この正規表現は実際に即してメールアドレスのフォーマットを定めたRFC2822より緩めのチェックを行うものだ。 valid_address = /\A[a-zA-Z0-9_\#!$%&`'*+\-{|}~^\/=?…