マニュアル: Ruby

投稿日: 更新日: プログラミング

よく使うもの

文法

演算子式

演算子式

ブロック付きメソッド

記述方法

以下の2通りの記述が可能。

[1..3].each {|i|
  ...
}
[1..3].each do |i|
  ...
end

違いは以下だけのようです。

{ ... } の方が do ... end ブロックよりも強く結合します。

自分はハマったことないですが(どちらかと言えば中括弧使うので)、 これで挙動が変わるケースもあります。

制御

ブロックの中でreturnをすると、ブロック自体を抜けてしまう。 値を返して次のループを回す場合は、next(next, next val)を使う。

ヒアドキュメント

ヒアドキュメント (行指向文字列リテラル)

基本

str = <<EOS
  abc
  def
  #{3+2}
EOS

結果はprint " abc\n def\n 5\n"と同じになります。 <<EOS<<"EOS"と書いても同じです。

変数展開なし

str = <<'EOS'
  abc
  def
  #{3+2}
EOS

#{3+2}のところが展開されません。

コマンド実行

str = <<`EOS`
  expr 3 + 2
EOS

文字列の中を実行します。

終端行をインデント可能にする

str = <<-EOS
  abc
  def
  #{3+2}
  EOS

先頭の空白を除く

これまでの例では先頭に2つのスペースが入っていましたが、 以下のようにすると、スペース2つが取り除かれます。 (改行のみの行は無視)

str = <<~EOS
  abc
  def

  #{3+2}
EOS

例外

呼び出し元で処理させたい場合は自前で例外クラスを作る、 それ以外は単にraiseを使ってRuntimeExceptionを投げるのでいいと思います。

数値

乱数

Kernel#randを使う。

rand      # 0〜1までの実数
rand(2)   # 0 or 1
rand(100) # 0〜99

初回呼び出し時にはKernel#srandを使って、 乱数の種を初期化する。

文字列

正規表現

RegExp#match の使用例

re = Regexp.compile("正規表現文字列")
match_data = re.match(str)
if match_data == nil then
  # マッチしなかったとき
end

RegExp#match の使用例2 iTunesのURLから、idを取得する方法。

id = %r|/id([0-9]+)|.match(url)[1]

多言語化

他のソフトのほとんどは内部エンコーディングにUnicode(UTF-8、古いものはUTF-16)を使用しているが、RubyはCSI(Code Set Independent)方式を採用している。

使ってみると難しくないです。

エンコーディングのリスト

以下のコマンドで取得可能。

ruby -e "puts Encoding.list" | sort

Array

Hash

以下の記法が推奨されるようです(RuboCop曰く)。

{ a:"A", b:"B", c:"C" }

でも文字列とシンボルは違うものなので、Hashのキーとしては混乱の元ですね。。。

日付処理


Enumerable

ネット

URL/URI

HTTP

HTML/XML

Nokogiri

以下のように使います。 オブジェクトは以下のようになります。

require 'nokogiri'

# 文字列
Nokogiri::HTML(str)

# ファイル
File.open(file) { |f|
  Nokogiri::HTML(f)
}

# open-uri
require 'open-uri'
Nokogiri::HTML(open(url))

# タイトルの取得
Nokogiri::HTML(open(url)).title

パス関連

JSON

JSONクラス

引数

テスト

入出力

標準入力から入力するとカーソルの挙動がおかしい

少なくともmacでは、標準入力から入力すると、バックスペース(delete)の挙動がおかしい。 例えば「あいう」のあとdeleteキーを2回押しても、カーソルは「う」の位置で、表示は「あい」になる。 返された文字列は「あ」で正しい。

この問題を解決するには、Readlineモジュールを使うのが簡単。 複数行対応のメソッドはないが、以下のようにすれば複数行対応可能。 入力終了はCtrl + Dで同じ(この場合Readline#readlineはnilを返す)。 Emacsキーバインドも使える。

note = ""
while (buf = Readline.readline) != nil
  note += buf + "\n"
end

なお、上のコードはwhile buf = Readline.readlineでもOKですが、 ==の間違いと誤解されるので、あえてnilと比較するようにしました。

端末にカラー出力

AWS

外部サイト

逆引きマニュアル



ページトップへ戻る