ラベル Ruby の投稿を表示しています。 すべての投稿を表示
ラベル Ruby の投稿を表示しています。 すべての投稿を表示

[Ruby]配列を展開して関数の引数に使う

たくさんの引数を取る関数に対して、呼び出し前に配列を使って引数を用意し、呼び出し時には配列を展開して引数を渡すことができる。その際は、配列の直前にアスタリスク(*)を付ければよい。
特に、引数の数が不定の場合などに役立つ。

例:
# 配列の入った変数に対して
a = [1, 2, 3]
sprintf('%d %d %d', *a)
# => "1 2 3"

# 配列リテラルに対して直接使うこともできる
sprintf('%d %d %d', *[1, 2, 3])
# => "1 2 3"

逆に、不定個の引数を取る関数を定義したい場合には、仮引数にアスタリスクを付ける。

例:
def hoge(*a)
  p a
end
hoge(1, 2, 3, 4)
# [1, 2, 3, 4]
この場合、渡された複数の引数が入った配列がaに入る。

[Ruby]文字列内で正規表現に一致するパターンを全て抽出する

HTMLファイルに出現する特定のタグをすべて抜き出したいときなど、文字列内で繰り返し出現するパターンを正規表現を用いてすべて抽出するには、 String#scan を使う。一致したパターンが全て入った配列が取得できる。

例:
>> '1<img src="1.jpg"><br>2<img src="2.jpg">'.scan(/<img.*?>/)
=> ["<img src=\"1.jpg\">", "<img src=\"2.jpg\">"]

[Ruby]文字列をロケールのエンコーディングに変換する (1.9以上対象)

ファイル名など、システムのロケールに依存する文字列を出力する場合、スクリプト内にエンコーディング名を決め打ちしていると移植性が低下してしまうので、実行時にエンコード名を指定したい。
システムのロケールで設定されているエンコーディング名は Encoding.locale_charmap で取得できる。
"文字列".encode(Encoding.locale_charmap)
このようにして、ロケールのエンコーディングに変換された文字列を簡単に取得できる。

[Ruby]Web上のファイルを直接開く

Web上のファイルを直接開いて読み込むだけの単純な処理の場合、 net/http を使って長いコードを書かなくても、 open-uri を使うことで簡単にファイルを取得し通常のIOと同様に読み込むことができる。ハッシュの形で引数を指定することで、リクエストヘッダなどのオプションを指定できる。

例:
require 'open-uri'
  
open("http://example.com/hoge.html", "Referer" => "http://example.com/") {|file|
  puts file.read()
}
HTTPSの場合も同様に使うことができる。ただし、Ruby 1.9以上でHTTPSのページを開こうとすると、このようなエラーが出ることがある。

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

この場合は以下のように :ssl_verify_mode オプションを指定すればよい。指定する値は OpenSSL::SSL::SSLContext#verify_mode= と同じである。サーバーの証明書を検証する必要がなれば、 OpenSSL::SSL::VERIFY_NONE で大丈夫である。
open("https://example.com/", :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE) {|file|
  puts file.read()
}
この場合もヘッダ等のオプションは同様に指定できる。