Edited at

便利なRubyイディオム

More than 1 year has passed since last update.


「Rubyならこう書く」あれこれ


  • Arrayオブジェクト

  • Rangeオブジェクト

  • ブロックとProcオブジェクト

  • シンボルとハッシュ

  • クラスとコンストラクタ

(追記)

ブロックとProcオブジェクトについては、長くなったので以下に分離しました。

[Ruby基礎] ブロックとProcをちゃんと理解する

http://qiita.com/kidachi_/items/15cfee9ec66804c3afd2


配列(Array)


要素の操作


#配列要素の分割
> "foo bar bazz".split
=> ["foo", "bar", "bazz"]

#配列要素の指定文字列での分割
> "fooxbarxxxxbazz".split('x')
=> ["foo", "bar", "", "", "", "bazz"]

#配列要素の順番入れ替え
> "foo bar bazz".split.reverse
=> ["bazz", "bar", "foo"]

#配列要素の順番入れ替え
> a = "foo bar bazz".split.shuffle
=> ["bar", "foo", "bazz"]


要素の追加

#配列要素の追加

> a.push(8)
=> ["bar", "foo", "bazz", 8]

#配列要素の追加2
> a << 10
=> ["bar", "foo", "bazz", 8, 10]

#配列要素の追加3(chain)
> a << 'fuga' << 'moga'
=> ["bar", "foo", "bazz", 8, 10, "fuga", "moga"]

#配列要素の結合
> a.join
=> "barfoobazz810fugamoga"

#配列要素の結合2
> a.join(', ')
=> "bar, foo, bazz, 8, 10, fuga, moga"


範囲(Range)


範囲から配列生成

#「.」2つで後方の要素(9)を含む

> (0..9).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

#「.」3つで後方の要素(9)は含まない
> (0...9).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8]


配列要素を範囲で指定して取得

#文字列を配列に変換

> b = %w[foo bar baz fuga moga]
=> ["foo", "bar", "baz", "fuga", "moga"]

#配列から指定範囲を取り出す
> b[0..2]
=> ["foo", "bar", "baz"]


配列要素を範囲で指定して取得2

#配列へ変換

> c = (0..9).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

#配列の最後の要素指定
> c[5..(c.length-1)]
=> [5, 6, 7, 8, 9]

#配列の最後の要素指定2
> c[5..-1]
=> [5, 6, 7, 8, 9]


その他

#範囲は文字列に対しても利用出来る

> ('a'..'e').to_a
=> ["a", "b", "c", "d", "e"]


ブロック

分かりづらかったので少し丁寧に。


  • ブロックとは何か

  • yield、Procとは何か

  • Proc補足

  • で、ブロックやProcって何が嬉しいの?

の順でいきます。

(追記)

本項は以下を参照。

[Ruby基礎] ブロックとProcをちゃんと理解する

http://qiita.com/kidachi_/items/15cfee9ec66804c3afd2


シンボル

文字列と近いが、少々性質が異なる。

内部的な比較の際、文字列は1文字ずつ比べる必要があるが、

シンボルは一度に全体を比較可能。

→ハッシュ等のキーとして理想的な性質。

#文字列は分割できる

>> "name".split('')
=> ["n", "a", "m", "e"]
#シンボルは分割できない
>> :name.split('')
NoMethodError: undefined method `split' for :name:Symbol

#文字列は(分割して)reverseできる
>> "foobar".reverse
=> "raboof"
#シンボルは(分割して)reverseできない
>> :foobar.reverse
NoMethodError: undefined method `reverse' for :foobar:Symbol

Ruby 1.9以降では、シンボルをキーとして扱う場合の特別な記法をサポート。

以下の二つは同義。

{ :hoge => 'hoge', :fuga => 'fuga'}

{ hoge: 'hoge', fuga: 'fuga'}

よって以下二つも同義。

>> h1 = { :name => "hogefuga", :email => "foo@example.com" }

=> {:name=>"hogefuga", :email=>"foo@example.com"}

>> h2 = { name: "hogefuga", email: "foo@example.com" }
=> {:name=>"hogefuga", :email=>"foo@example.com"}

>> h1 == h2
=> true

ハッシュがよりスムーズに記述できる。


ハッシュをブロックに渡す

>> hash = { success: "It worked!", error: "It failed." }

=> {:success=>"It worked!", :error=>"It failed."}

>> hash.each do |key, value|
>> puts "Key #{key.inspect} has value #{value.inspect}"
>> end
Key :success has value "It worked!"
Key :error has value "It failed."

→ブロックにはkeyとvalueの二つが渡ることになる。

※inspectはオブジェクトを可視化して返す

inspectを用いない場合、

>> hash.each do |key, value|

>> puts "Key #{key} has value #{value}"
>> end
Key success has value It worked!
Key error has value It failed.

こうなる。


Railsに現れるRuby

上のハッシュの知識をもとに、Rails内で使うRubyの記述を読み解いてみる。


cssを出力するタグの例

<%= stylesheet_link_tag "application", media: "all",

"data-turbolinks-track" =
> true %>

いくつか特徴がある。


  1. メソッド呼び出しの丸かっこは省略可能。
    →以下は同義

stylesheet_link_tag("application", media: "all",

"data-turbolinks-track" => true)
stylesheet_link_tag "application", media: "all",
"data-turbolinks-track" => true


  1. 最後の引数がハッシュの場合、波括弧は省略可能。
    →以下は同義

stylesheet_link_tag "application", { media: "all",

"data-turbolinks-track" => true }
stylesheet_link_tag "application", media: "all",
"data-turbolinks-track" => true


  1. シンボルではハイフンを使用できない
    (mediaは「media:」という新式の記法なのに、data-turbolinks-trackは
    「"data-turbolinks-track" =>」という旧式記法である理由)

data-turbolinks-track: true  #NG。シンボルではハイフンを使用できない

"data-turbolinks-track" => true #OK


結果、出力されるタグ

<link data-turbolinks-track="true" href="/assets/application.css" media="all" rel="stylesheet" />


クラスとコンストラクタ


String

>> a = "hoge"

=> "hoge"

#明示的な書き方
>> a = String.new("hoge")
=> "hoge"


Array

>> a = [1, 3, 2]

=> [1, 3, 2]

#明示的な書き方
>> a = Array.new([1, 3, 2])
=> [1, 3, 2]


Hash => コンストラクタが特殊

hashのコンストラクタに値を渡した場合、

「キーが存在しない場合に返されるデフォルト値」として定義される。

# 何も値を渡さずに初期化

>> h = Hash.new
=> {}
>> h[:foo] # 存在しないキー :foo
=> nil # キーが存在しない場合のデフォルト値はnil

# 値を渡して初期化
>> h = Hash.new(0) # デフォルト値をnilから0に変更
=> {}
>> h[:foo]
=> 0 # キーが存在しない場合のデフォルト値は0


Module

module ApplicationHelper

通常(生のRuby)では、moduleはincludeを使い呼び出す(MixidIn)ことができる。

が、Railsは自動で呼び出してくれるため、定義さえすれば全てのViewで利用することが出来る。


もう一歩踏み込むならこちら

[Ruby] 便利な組み込みクラスのメソッド達

Enumerable編

http://qiita.com/kidachi_/items/a00558cfb0a6a3e23f4b

Array編

http://qiita.com/kidachi_/items/e9cb26c4e6cb36b70a1c

Hash編

http://qiita.com/kidachi_/items/651b5b5580be40ad047e

String編

http://qiita.com/kidachi_/items/7b355eb355b2d1390cf5


以下に続く

[Ruby基礎] ブロックとProcをちゃんと理解する

http://qiita.com/kidachi_/items/15cfee9ec66804c3afd2