Ruby Tips!

RubyのTipsを紹介します

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

Marshalで配列やハッシュをディープコピーする

Object#dupやObject#cloneで配列やハッシュを複製すると、配列やハッシュ自体は複製されるがその要素までは複製されない。これはシャローコピー(浅いコピー)と呼ばれる。以下は配列を複製した時に、元の配列の要素を破壊的に変更すると、複製した配列にも影…

Rubyのリテラルについて

数値 数字を並べると数値となる。 1234 -1234 数値にはアンダーバーを含めることができる。 1_000_000 接頭詞を付けると10進数以外の数値も表記できる。 0b1010 0o7070 0d9090 0xF0F0 小数点をつけると数値は小数となる。 0.1 小数は仮数部e指数部と表記する…

fileutilsでファイルの操作のドライランをする

ファイル操作を行うfileutilsライブラリのメソッドは、オプションを指定することで、実際の操作は行わず、何を行うのかを出力(ドライラン)することができる。:noopは実際の操作は行わないようにするオプションで、:verboseは何を行うのかUNIXコマンドの形式…

ハッシュのキーになるクラスを定義する

あるクラスのオブジェクトがハッシュのキーになるためには、Object#hashとObject#eql?が適切に再定義されていなければならない。ハッシュの内部において、Object#hashは値を格納するためのハッシュ値の計算に、Object#eql?はキーの同一性判定に使われる。Obj…

ディレクトリを作成する

ディレクトリを作成するならDir.mkdirを使う。引数には作成するディレクトリと、モードを指定する。 Dir.mkdir('foo', 0755) filetutilsライブラリのFileUtils.mkdir_pを使えば深い階層のディレクトリや、複数のディレクトリをまとめて作成することができる…

新しいファイルを作成する

openのフラグにwまたはaを指定してファイルをオープンすれば新しいファイルを作成することができる。 open('foo.txt', 'w'){|f| f.puts 'hoge' } 新しい空のファイルを作成したいのであれば、fileutilsライブラリのFileUtils.touchも利用できる。 require 'f…

Rubyにおける多重継承について

Rubyでは複数のクラスを継承すること(多重継承)はできない。しかし複数のモジュールをインクルード(Mix-in)することはできる。RubyにおいてはMix-inこそ他の言語の多重継承に対応する機能である。以下に例を示す。 module A def a; end end module B def b; …

配列から要素を検索する

配列にある要素が含まれているかを判定するにはArray#include?を使う。このメソッドは引数で与えた要素と==で等しい要素が存在する場合にtrueを返し、存在しない場合はfalseを返す。 p [1, 2, 3].include?(2) #=> true p [1, 2, 3].include?(4) #=> false 何…

strftimeメソッドで時刻を文字列に整形する

Time#strftimeは時刻を指定したフォーマットで文字列に変換するメソッドである。フォーマットの文字列として以下が利用できる。 文字 意味 %A 曜日の名称(Sunday, Monday ... ) %a 曜日の省略名(Sun, Mon ... ) %B 月の名称(January, February ... ) %b 月の…

オブジェクトを複製する

オブジェクトを複製するにはObject#dupかObject#cloneを使う。Object#cloneはオブジェクトの内容だけでなく特異メソッドなどもコピーする。一般的にはObject#dupで十分だ。以下は文字列を複製する例である。 str = "sample string" def str.singleton_method…

メソッドを再定義するときaliasで元のメソッドを残しておく

メソッドを再定義するときaliasで元のメソッドを残しておくあるクラスを継承して既存のメソッドを再定義する場合、元のメソッドにaliasを付けておくと、再定義するメソッドの中で元のメソッドを呼ぶことができる。元のメソッドの機能を活かしつつ、何か機能…

タブとスペースを変換する

文字列中のタブとスペースを変換するには、String#gsubによる置換を使って以下のようにする。以下はタブをスペース4つと変換する例である。 p 'hoge\tpiyo\t\tfuga'.gsub('\t', ' ' * 4) #=> "hoge piyo fuga" p 'hoge piyo fuga'.gsub(' ' * 4, '\t') #=> "…

最大公約数・最小公倍数を求める

最大公約数はInteger#gcdで、最小公倍数はInteger#lcmで求めることができる。またInteger#gcdlcmは最大公約数と最小公倍数を同時に求めて配列で返す。 p 624.gcd(735) #=> 3 p 624.lcm(735) #=> 152880 p 624.gcdlcm(735) #=> [3, 152880] なおRuby 1.8では…

2進、8進、10進、16進数を相互に変換する

文字列を数値に変換する 2進数などで書かれた文字列を数値に変換するにはKernel.#IntegerまたはString#to_iを使う。String#to_iは基数が指定できるため、文字列に0xなどの接頭子が無くても数値に変換することができる。 p Integer("0b11111111") #=> 255 p I…

ファイルの最後にデータを追記する

ファイルの最後にデータを追記するには、openのオプションにaを指定して追記モードでファイルをオープンして、書き込みを行えば良い。 open('foo.txt', 'a'){|f| f.puts 'hoge' } ファイルをオープンするオプションの詳細についてはファイルを開く - Ruby Ti…

配列の中から最大値・最小値を求める

配列の中から最大値・最小値を求めるにはArray#max、Array#minを使う。 p [1, 2, 3, 4, 5].max #=> 5 p [1, 2, 3, 4, 5].min #=> 1 デフォルトでは最大値・最小値を求めるための比較はで行われる。ブロックを渡すと比較の処理を置き換えることができる。例え…

TCPクライアントを実装する

TCPクライアントを実装するにはsocketライブラリのTCPSocketを使う。以下は簡単なHTTPクライアントの例である。 require 'socket' TCPSocket.open('www.yahoo.co.jp', 80){|s| s.print "GET / HTTP/1.0\r\n\r\n" print s.read } TCPSocket.openには、接続先…

Rubyの文字列リテラルについて

Rubyには多数の文字列リテラルが存在する。1つずつ見てみよう。まず式展開が不要な文字列はシングルクオート'を使う。'と\以外、エスケープが不要なのも利点である。 p 'foo' #=> "foo" 式展開が必要な文字列はダブルクオート"を使う。Rubyの文字列の中で最…

平方根を求める

Rubyで数値の平方根を求めるにはMath.sqrtを使う。また、平方根はべき乗Numeric#**を使って、1/2乗として求めることもできる。負の数の平方根は複素数を表すComplexオブジェクトとして得られる。 require 'complex' p Math.sqrt(2) #=> 1.4142135623730951 p…

文字を置換する

文字列中のある文字を別の文字に置換するにはString#trが利用できる。以下は文字bを、Bに置換する例である。 p "foo bar buz".tr('b', 'B') #=> "foo Bar Buz" String#trの引数に複数文字からなる文字列を指定すると、両方に対応する位置の文字にそれぞれ置…

文字列を置換する

文字列を置換するにはString#subまたはString#gsubを使う。String#subはマッチした最初の1つだけを、String#gsubはマッチしたすべての文字列を置換した新しい文字列を返す。これらのメソッドの基本的な使い方は第1引数に置換対象の文字列か正規表現を指定し…

ファイル名を変更する

Rubyでファイル名を変更するには、File.renameまたはfileutilsライブラリのFileUtils.mvを使用する。これらはファイルを移動するメソッドである。引数には移動元のパス、移動先のパスを指定する。移動先のパスがディレクトリで既に存在する場合、ファイルは…

擬似的なキーワード引数を使う

このエントリではRuby 1.8と1.9で良く使われる擬似的なキーワード引数について説明する。Ruby 2.0にはキーワード引数が追加されたが、本エントリでは扱わない。Rubyはキーワード引数をサポートしていないので、ハッシュをキーワード引数に見立てて使うことが…

文字列を文字ごとに繰り返す

Ruby 1.9ではString#each_charメソッドを使うと、文字列を文字ごとに繰り返すことができる。 "あいうabc".each_char{|c| puts c } =begin あ い う a b c =end Ruby 1.8では文字列を文字ごとに繰り返すメソッドが用意されていない。以下のように、String#spl…

Rubyで複素数を扱う

Rubyで複素数を扱うにはcomplexライブラリのComplexクラスを使う。Complexオブジェクトは、Kernel.#Complex、Complex.rect、Complex.poler、Numeric#to_c、String#to_cなどを使って生成する。 require 'complex' p Complex(1, 2) #=> (1+2i) p Complex.rect(…

古いメソッドを呼び出したら警告を表示する

プログラムの更新に伴って、呼び出しが推奨されない古いメソッドが生じることがあるかもしれない。そのようなメソッドは本来プログラム上から取り除くべきだが、いきなり取り除いてしまうと影響が大きいため、呼び出したら警告を表示するようにするのは良い…

数値の絶対値を求める

Rubyで数値の絶対値を求めるにはNumeric#absを使う。 整数や浮動小数点数のほか複素数の絶対値もこのメソッドで求められる。 require 'complex' p -1.abs #=> 1 p -1.0.abs #=> 1.0 p Complex(-1, -1).abs #=> 1.4142135623730951

ファイルの内容が同一かを比較する

2つのファイルの内容が同一かを比較したいのであれば、fileutilsライブラリのFileUtils.cmpメソッドが利用できる。このメソッドは引数で与えた2つのファイルの内容を比較し、同じであれば真を返す。自力でファイルを少しずつ読み込んで比較するよりも遥かに…

配列を連結する / 配列をマージする

単純にある配列の後ろに別の配列を連結した新しい配列を得るにはArray#+を使う。 またArray#concatは、ある配列の後ろに別の配列を破壊的に連結する。 p [1, 2, 3] + [4, 5, 6] #=> [1, 2, 3, 4, 5, 6] a = [1, 2, 3] a.concat([4, 5, 6]) p a #=> [1, 2, 3,…