Ruby Tips!

RubyのTipsを紹介します

2014-03-01から1ヶ月間の記事一覧

特定の文字の出現回数をカウントする

String#countは特定の文字の出現回数をカウントして返すメソッドだ。Ruby 1.9はマルチバイト文字にも対応しているが、Ruby 1.8ではマルチバイト文字に対応していない事に注意。 p "foo bar buz".count('b') #=> 2 p "ほげほげぴよぴよ".count('ほ') #=> 2 Ru…

正規表現にマッチした前後の文字列を得る

正規表現にマッチした前後の文字列を得るには2つ方法がある。1つは組み込み変数を使う方法だ。Rubyでは正規表現によるマッチを行った後に、組み込み変数$`と$'にそれぞれ正規表現にマッチした前の文字列と後ろの文字列が格納される。2つめの方法はString#mat…

正規表現で空白文字をマッチさせる

Rubyの正規表現ではメタ文字\sが空白文字にマッチする。空白文字とは文字クラス[ \t\r\n\f]のことであり、半角スペースのほかタブや改行文字にもマッチする。以下はString#gsubにより文字列から空白文字をすべて除去する例である。 p " \t\rfoo\n\f".gsub(/\…

プログラムの実行を停止する

Rubyでプログラムの実行を停止するにはKenrel.#sleepを使う。Kernel.#sleepは引数にプログラムの実行を停止する秒数を取る。 sleep(1) # 1秒停止 sleep(0.1) # 0.1秒停止 引数なしでKernel.#sleepを呼び出すとプログラムは永久に停止する。ただし他のスレッ…

オブジェクトに定義されているメソッドを調べる

オブジェクトからメソッド一覧を得る オブジェクトからメソッドの一覧を得るにはObject#methods等のメソッドが利用できる。以下にメソッド一覧を取得するメソッドと、取得できるメソッドの種類を示す。 メソッド名可視性 メソッド特異メソッド publicprotect…

配列やハッシュの要素を走査する

配列やハッシュの全要素を走査するにはArray#eachとHash#eachが利用できる。このメソッドは、要素を1つずつ取り出して、ブロックに渡す。配列の場合、ブロックパラメータは要素の1つだけだが、ハッシュの場合はキーと要素の2つがブロックパラメータとなる。…

文字列のエンコーディングを確認する

Ruby 1.9では文字列がエンコーディングを持つようになった。ある文字列のエンコーディングを確認するにはString#encodingメソッドを使用する。返却値はEncodingオブジェクトである。 p "123abc".encoding #=> #<Encoding:UTF-8> Encodingオブジェクトがどのようなエンコーデ</encoding:utf-8>…

パスを絶対パスに展開する

相対パスや短縮されたパスを絶対パスに展開するにはFile.expand_pathを使う。第1引数には変換したいパスを、第2引数にはパスを展開する基準となるディレクトリを指定する。第2引数を省略した場合は、カレントディレクトリを基準としてパスを展開する。以下は…

有理数(Rational)を使った計算をする

Rubyには有理数をあらわすRationalクラスが用意されている。このクラスを使うにはRuby 1.8ではrationalライブラリをrequireする。Ruby 1.9ではrationalライブラリのrequireは必要ない。有理数の生成はKernel.#Rationalを使う。Rationa.newでないことに注意。…

文字列を繰り返した文字列を作る

文字列を繰り返した文字列を作るにはString#*が利用できる。以下はfooという文字列を5回繰り返した新しい文字列を作る例である。 p "foo" * 5 #=> "foofoofoofoofoo"

2つの日時の差を求める

RubyのTimeやDateには-演算子が定義されており、2つの日時の差を簡単に求めることができる。Timeの差は秒単位で、Dateの差は日単位で得られる。ただしDate#-の返り値は有理数を現すRationalオブジェクトである。 require 'date' p Time.at(10010) - Time.at(…

日付から年度を求める

日本では3月末日までを前年度、4月初日からを翌年度とする年度が広く使われている。これは実際の年月日の3ヶ月後まで同じ年度が続くということなので、ある日付から3ヶ月を減算して年を求めれば、その日付の年度を求めることができる。Rubyで日付から月単位…

生年月日から年齢を求める

Rubyには生年月日から年齢を求めるメソッドは存在しない。このため生年月日から年齢を求めるには、Dateクラスを使って自分で計算をする必要がある。 require 'date' birthday = Date.new(1986, 12, 1) today = Date.today # 2014/3/27 age = today.year - bi…

ファイルに追記された内容を読み込む

ログファイルは末尾に新しい内容が追記されていくのが一般的である。そのようなファイルに対しては、File#readがEOFを返しても、繰り返し読み込み続けることで、ファイルに追記された内容を読み込むことができる。以下はコマンドライン引数で渡されたファイ…

2つの配列の論理積を取る

2つの配列の論理積を取るにはArray#&を使う。Array#&は配列に共通した要素をまとめて新しい配列として返す。もし重複した要素が存在する場合は2個目以降は無視される。 p [1, 2, 3] & [1, 3, 4] #=> [1, 3] p [1, 1, 2, 3] & [1, 3, 3, 4] #=> [1, 3]

文字列末尾の改行や空白文字を除去する

文字列末尾の改行を除去するには、String#chompメソッドを使う。String#chompは、引数に\nを与えると、\rも取り除く。また引数を省略した場合は組み込み変数$/が指定されたものとして動作する。$/のデフォルトは\nである。 p "foo\n".chomp #=> "foo" p "foo…

和暦と西暦を変換する

Date.parseはJIS X 0301形式の和暦を解釈することができる。以下が和暦を西暦に変換するサンプルコードである。 require 'date' p Date.parse("H25.03.26") #=> #<Date: 2013-03-26 ((2456378j,0s,0n),+0s,2299161j)> 逆に西暦を和暦に変換するには、Date#jisx0301を使って以下のようにする。Date#jisx0301はRub</date:>…

クラスを定義する

クラスを定義するには以下のようにする。 class クラス名 クラスの内容 end 他のクラスを継承するにはを使う。 class サブクラス名 < スーパークラス名 クラスの内容 end クラスはネストして定義することもできる。 class ClazzA class ClazzB end end ::を…

ブロックをオプションで取るメソッドを定義する

メソッドが呼び出された時にブロックが渡されたかどうかはblock_given?で判定することができる。これを使えばブロックが渡された場合、渡されなかった場合、両方に対応したメソッドを定義することができる。 def method() if block_given? # ブロックあり el…

クラスメソッドを定義する4つの方法

クラス定義中でクラス名.メソッド名の形でクラスメソッドを定義できる。 class Clazz def Clazz.class_method # 処理 end end クラスオブジェクトはクラス定義中でselfで参照できるため、クラス名の代わりにselfと書いても良い。 class Clazz def self.class…

配列の要素を連結して文字列化する

配列の要素を連結して文字列化するにはArray#joinを使う。デフォルトでは単に要素が連結される。 p ['foo', 'bar', 'buz'].join #=> "foobarbuz" Array#joinには引数でセパレータを指定することができる。例えばCSV風に配列を文字列化するには以下のようにす…

メソッドを定義する

メソッドの定義 メソッドは以下のようにして定義する。 def メソッド名(引数) 処理内容 end引数には以下の4種類がある。 引数の書式 意味 arg デフォルト式のない引数 arg = val デフォルト式のある引数 *arg 可変長引数 &arg ブロック引数 以下は4種類の引…

特殊文字を2重にしてエスケープする

SQLのように特殊文字を2重にするエスケープもString#gsubを使って簡単に記述できる。 p "foo'bar\"buz\\".gsub(/['"\\]/){|c| c + c} #=> "foo''bar\"\"buz\\\\" エスケープした文字列をアンエスケープする処理は、同様にString#gusbを使って以下のように記…

特殊文字をバックスラッシュでエスケープする

String#gsubを使えば特殊文字をバックスラッシュでエスケープする処理を簡単に記述できる。 p "foo'bar\"buz\\".gsub(/['"\\]/){|c| "\\" + c} #=> "foo\\'bar\\\"buz\\\\" ポイントはブロック付きでString#gsubを呼び出すこと。引数を2つ取るgsubでは置換文…

カレントディレクトリを変更する

カレントディレクトリを変更するには、File.chdirまたはFileUtils.chdirを使う。 p Dir.pwd #=> "/home/rubytips86" Dir.chdir('/') p Dir.pwd #=> "/" これらのメソッドはブロックを取ることもできる。ブロックを与えるとブロックの中でだけカレントディレ…

文字列を分割して繰り返す

String#each、String#each_line、String#linesは文字列の分割して繰り返しを行うメソッドだ。これらのメソッドは、引数で区切り文字を指定することで動作を変えることができる。引数を与えない場合、これらのメソッドは組み込み変数$/の値で文字列を分割する…

Rubyの例外処理

Rubyの例外処理はbegin-rescueで行う。 begin # 処理1 rescue # 処理2 else # 処理3 ensure # 処理4 end begin節の処理1で例外が発生すると、rescue節の処理2が実行される。 begin節の処理1で例外が発生しなければ、else節の処理3が実行される。 例外が発生…

配列に要素を追加する

配列の先頭に要素を追加するには、Array#unshiftまたは、Array#[]=を使って以下のようにする。 a = [] a.unshift(1) a[0, 0] = 2 p a #=> [2, 1] 配列の末尾に要素を追加するには、Array#pushまたは、Array#を使って以下のようにする。 a = [] a.push(1) a <…

大文字と小文字を変換する

文字列のすべてのアルファベットを小文字にするにはString#downcaseを使う。 p "AbCdEf".downcase #=> "abcdef" 逆に文字列のすべてのアルファベットを大文字にするにはString#upcaseを使う。 p "AbCdEf".upcase #=> "ABCDEF" 大文字は小文字に、小文字は大…

ホスト名からIPアドレスを得る / IPアドレスからホスト名を得る

ホスト名からIPアドレスを得るには、Socket.getaddrinfoを使う。 第1引数にはホスト名、第2引数にはサービス名を与える。 返却値はアドレス情報の配列であり、3番目の要素にIPアドレスが格納されている。逆に、IPアドレスからホスト名を得るには、Socket.get…