Ruby Tips!

RubyのTipsを紹介します

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

Fileのクラスメソッドでファイルを調査する

Fileにはファイルの調査に使える以下のクラスメソッドが用意されている。 クラスメソッド 意味 exist? ファイルが存在するか size? ファイルが存在して、かつ空でないか zero? ファイルが存在して、かつ空か file? ファイルか directory? ディレクトリか sym…

配列の差を取る

配列の差を取るにはArray#-を使って以下のようにする。 これで左辺の配列から右辺の配列にある要素がすべて取り除かれる。 a1 = ["apple", "orange", "mango"] a2 = ["orange"] p a1 - a2 #=> ["apple", "mango"] なお重複した要素があった場合はすべての要…

配列を初期化する

配列はArray.newの引数やブロックによって初期化することができる。以下は要素数3の配列を生成する例である。デフォルトの初期値はnilである。 p Array.new(3) #=> [nil, nil, nil] 第2引数で初期値を指定できる。以下は配列のすべての要素をtrueとする例で…

スクリプトの処理時間を計測する

Process.timesでプロセス開始時から使用したCPU時間が取得できる。 Process.timesが返すStruct::Tmsオブジェクトの内容は以下の通り。 属性 意味 utime ユーザーCPU時間 stime システムCPU時間 cutime 終了した子プロセスのユーザCPU時間の合計 cstime 終了…

モジュールを定義する

Rubyでモジュールを定義するには以下のようにする。 module モジュール名 モジュールの内容 endモジュールは他のクラスからincludeまたはextendして使用する。 module MyModule def hello_world puts 'Hello, World!' end end class MyClass1 include MyModu…

配列の要素が条件を満たすか調べる

Array#any? 配列に1つ以上、条件を満たす要素があるか調べるにはArray#any?を使う。 p [1, 2, 3].any?{|i| i % 2 == 0} #=> true p [1, 3, 5].any?{|i| i % 2 == 0} #=> false Array#all? 配列のすべての要素が、条件を満たしているか調べるにはArray#all?を…

オブジェクトを文字列に変換する

デバッグ時にはオブジェクトを文字列に変換して内容を確認したい場合がある。RubyではObjectにObject#to_sが定義されているため、明示的に禁止されていない限り、あらゆるオブジェクトを文字列化できる。 obj = Object.new puts obj.to_s #=> #<Object:0x000000009a0d30> Object.inspe</object:0x000000009a0d30>…

文字列を16進数文字列に変換する

文字列を16進数文字列に変換するにはString#unpackを使って以下のようにする。 STring#unpackは配列を返すので、先頭要素を取り出すためArray#firstを使っている。 p "123abc".unpack('H*').first #=> "313233616263" 逆に16進数文字列を普通の文字列に変換…

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

net/http RubyでHTTPを扱うには、net/httpライブラリを利用する。 Net::HTTP.startで指定したホストとポートに対してHTTPアクセスを開始する。 実際のアクセスはNet::HTTPのインスタンスを利用してNet::HTTP#getなどのメソッドで行う。 require 'net/http' r…

ファイルを開く

Rubyでファイルを開くには、openまたはFile.openを使用する。 第1引数には開くファイルのパスを、第2引数にはフラグを指定する。第2引数のフラグは以下の文字列または定数の論理和で指定する。 フラグ文字列 意味 r 読み込みモード w 書き込みモード a 追記(…

三角関数を使用した計算をする

Rubyでは、Mathモジュールに三角関数が定義されている。 これらの関数に与えるのはラジアンである。 モジュール関数 意味 sin 正弦関数 sinh 双曲線正弦関数 cos 余弦関数 cosh 双曲線余弦関数 tan 正接関数 tanh 双曲線正接関数 asin 逆正弦関数 asinh 逆双…

特異クラスを開いてクラスメソッドを定義する

Rubyにおいて、クラスメソッドとはクラスオブジェクトの特異メソッドである。特異メソッドは特異クラスのインスタンスメソッドである。よって、クラスオブジェクトの特異クラスを開いてインスタンスメソッドを定義すれば、クラスメソッドを定義できることに…

一時ファイルを作成する

Rubyで一時ファイルを作成するにはtempfileライブラリが利用できる。Tempfile.newは一時ファイルを作成するメソッドで、一時ファイルのFileオブジェクトを返す。一時ファイルはFileオブジェクトがガーベジコレクションされたタイミングで自動的に削除される…

一時ディレクトリを作成する

Rubyで一時ディレクトリを作成するにはtmpdirライブラリが利用できる。timdirライブラリが提供するDir.mktmpdirは、一時ディレクトリを作成するメソッドだ。以下のようにして簡単に一時ディレクトリを作成できる。 require 'tmpdir' require 'fileutils' dir…

TCPサーバを実装する

RubyでTCPサーバを簡単に実装するにはsocketライブラリのTCPServerクラスを使うと良い。TCPServer.newには、接続を待ち受けるIPアドレスと、ポート番号を指定する。クライアントからの接続はTCPServer#acceptで待つ。TCPServer#acceptはクライアントとの接続…

ファイルの行数をカウントする

IO#getsやIO#each_lineで行単位の読み込みを行った場合、読み込んだ行数がIO#linenoに保存される。これを参照することで、ファイルの行数を簡単にカウントすることができる。 open('foo.txt'){|f| while f.gets; end p f.lineno } もしファイル全体をメモリ…

配列に要素を代入する

Rubyで配列に要素を代入するにはArray#[]=を使う。 a = [] a[0] = 'a' a[1] = 'b' p a #=> ["a", "b"] もし配列の長さを超えるインデックスを指定した場合、間の要素はnilで埋められる。 a = [] a[2] = 'c' p a #=> [nil, nil, "c"] インデックスに範囲を指…

文字列を任意のバイト数で改行する

NKFの-fオプションを使うと、文字列を任意のバイト数で改行することができる。 require 'nkf' str = "本日は晴天なり。本日は晴天なり。本日は晴天なり。本日は晴天なり。本日は晴天なり。本日は晴天なり。本日は晴天なり。本日は晴天なり。本日は晴天なり。…

文字列の長さを得る

バイト数を得る 文字列のバイト数はSrting#bytesizeメソッドで得られる。 p "abcあいう".bytesize #=> 12 文字数を得る Ruby 1.9ではString#sizeで文字数が得られる。(※Ruby 1.8ではバイト数となる) p "abcあいう".size #=> 6 Ruby 1.8で文字数を得るには、S…

HTMLのエスケープとアンエスケープ

HTMLで&"<>を表示するには、実体参照という形式でエスケープする必要がある。RubyでこのHTMLエスケープを行うには、CGI.escapeHTMLが利用できる。 require 'cgi' p CGI.escapeHTML('&"<>') #=> "&amp;&quot;&lt;&gt;" エスケープしたHTMLを元に戻す(アンエス…

文字列からURLを抽出する

文字列からURLを抽出するにはuriライブラリのURI.extractメソッドが利用できる。 require 'uri' str = " http://www.ruby-lang.org/ ftp://ftp.ruby-lang.org/pub/ " p URI.extract(str) #=> ["http://www.ruby-lang.org/", "ftp://ftp.ruby-lang.org/pub/"]…

RubyでHTMLを整形する

CGI.prettyメソッドを使えば、乱雑に書かれたHTMLを、良い具合に整形することができる。Rubyで作成したCGIでHTMLを出力する前に使えば、簡単に綺麗なHTMLを出力することが可能だ。 require 'cgi' html = <<HTML <html><head><title>Ruby Tips!</title></head><body><h1>Sample HTML</h1><p>Hello, World!</p><ul><li>foo</li><li>bar</li><li>buz</li></ul></body></html> HTML …

正規表現で繰り返しマッチさせる

正規表現でマッチしたより後ろの文字列は組み込み変数$'で参照することができる。正規表現によるマッチと$'の参照を繰り返し行うことで、徐々に正規表現のマッチを進めていくことが可能だ。 str = "abc def ghi" p str.slice(/abc/) #=> "abc" p $' #=> " de…

gzipで圧縮・展開を行う

gzipはUNIXで使われる標準的な圧縮形式だ。 Rubyではzlibライブラリを使って、gzip形式の圧縮と展開が行える。gzip形式のファイルを書き出すには、Zlib::GzipWriterを使う。 このクラスは出力をgzip圧縮しながら書き出すIOのラッパであり、IOと同様に扱うこ…

配列を条件に基づいて分割する

Array#partitionを使えば、配列をブロックを満たす要素と、そうでない要素に分割した新しい配列を作ることができる。 p [1, 2, 3, 4, 5, 6].partition{|i| i % 2 == 0 } #=> [[2, 4, 6], [1, 3, 5]] より高度な分割はArray#group_byで行える。このメソッドは…

文字列が複数の正規表現にすべてマッチするか判定する

文字列が複数の正規表現にすべてマッチするか判定する決まった方法は存在しない。 簡単でわかりやすいのは、正規表現によるマッチを複数行い、andで繋げてしまう方法だ。 str = "abcdefghi" p /abc/ =~ str and /def/ =~ str and /ghi/ =~ str #=> 0 Array#f…

Array#uniqで配列から重複する要素を取り除く

Array#uniqは配列から重複した要素を取り除いた新しい配列を返す。 新しい配列を返すのではなく、破壊的に配列から重複した要素を取り除くArray#uniq!もある。 p [5, 1, 2, 4, 3, 1, 2, 5, 3, 5].uniq #=> [5, 1, 2, 4, 3] a = [4, 3, 4, 5, 3, 2, 5, 4, 1, …

正規表現のメタ文字をエスケープする

文字列の中で正規表現で特別な意味を持つメタ文字をバックスラッシュでエスケープするにはRegexp.quoteまたはRegexp.escapeを使って以下のようにする。 p Regexp.quote('...') #=> "\\.\\.\\." p Regexp.escape('^$') #=> "\\^\\$" これらのメソッドはメタ文…

文字列が空行を含むか判定する

文字列が空行もしくは空行を含むか判定するには、正規表現を使って以下のようする。 空行は空文字列か改行のみで構成される行とする。 p /^$/ =~ "" #=> 0 p /^$/ =~ " " #=> nil p /^$/ =~ "\n" #=> 0 p /^$/ =~ "abc" #=> nil p /^$/ =~ "abc\n" #=> nil p…

ファイルの情報を変更する

時刻 ファイルのアクセス時刻(atime)、更新時刻(mtime)を設定するにはFile.utimeを使う。 atime = mtime = Time.now File.utime(atime, mtime, "hoge.txt") これらの時刻を現在時刻に設定するのであれば、FiletUtils.touchも利用できる。 require 'filetutil…