いろいろなオブジェクト
Rubyには数値や文字列の他に便利なオブジェクトがいろいろ用意されています。
配列、ハッシュ、正規表現、日付、時刻についてまとめる。
シンボル
Rubyでのシンボルとは名前を表すオブジェクト。
シンボルを創るには「:cat」のように名前の前にコロンをつける。
シンボルの使い方はメソッドや変数の名前を示すのに使う。
respond_to?メソッドにシンボルを渡すとそのオブジェクトがメソッドを持っているかどうかを調べることができる。
obj.find(1) if obj.respond_to?(:find)
これだったら、objというオブジェクトが、findというメソッドを持っているかどうか
→引数でシンボルを渡せるということを理解すれば良い。
メソッドや変数のためだけでなく、
アプリケーションで特別な意味を持つ名前を表すのにもシンボルが使われる。
例:シンボルでURLのパスを表している。
link_to "会員一覧", :menbers
Rails開発でよく使う
→ハッシュのキーをシンボルにすること。
link_toメソッドの第三引数にハッシュでオプションを渡している。
※オプションは調べようね。
オプションはこの例だと、htmlのclassとかあとidとかもそう。
例
link_to "Home", root_poth, class: "menu" # 「class: "menu"」 は 「:class => "menu"」 と同じ。
けっきょくシンボルって??
シンボルとは文字列とよく似ているが、正体は「文字列を整数で表したもの」。
- シンボルを作るとRuby内部では「文字列→一意の整数」の変換が行われ、整数値として管理される。
- シンボルは1つの文字列が1つのオブジェクトに一対一で対応する。
- シンボルの内容は変更できない。upcase!のような!付きのメソッドを持たない。
文字列の代わりにシンボルを使うとプログラムの実行を少々効率化できますが、
使用される理由はソースコードを読みやすくするためがある。
→シンボルを使えばある文字列が特別な意味を持つ「名前」を表していることを
明示できるから。
シンボルのリテラル
シンボルの名前にはどんな文字でも使えるが変数名やメソッド名に使えるものしかダメ。
:1234のように数字で始めることはできない。
その場合:”1234″とういう形にする必要がある。
※@や?は使用可能。
配列、ハッシュ、範囲
配列、ハッシュ、範囲の3つはオブジェクトの集まりを取り扱うオブジェクト。
配列オブジェクトには検索用のメソッドがいくつも用意されている。
例えば引数が配列に含まれている時にtrueを返すinclude?メソッド
fruits = ["applle", "orange", "banana"]
puts "OK" if fruits.include?("banana")
ちなみに「XがA,B,C・・・のどれかの場合」という条件を記述するときには、
配列とiclude?メソッドを使うと便利。
print "合言葉:"
word = gets.chomp
if ["apple", "orange", "banana"].include?(word)
puts "OK"
end
※RailsのActive Supportが用意している「in?」メソッドもある。
include?メソッドと逆で、
あるオブジェクとが配列に含まれているかどうかを調べるメソッド。
fruits.include?(“banana”)は”banana”.in?(fruits)と同じ
配列にはブロックを使って条件を調べるためのメソッドもたくさんある。
all?メソッドは、「すべての要素が条件を満たす」かどうかを
any?メソッドでは「どれか1つが条件を満たす」かどうかを確かめれる。
numbers = [1,2,3,4,5,6,7,8,9]
puts "OK" if numbers.all? { |item| item > 0 } # すべて0より大きいか
puts "OK" if numbers.any? { |item| item % 2 == 0 } # 偶数がふくまれるか
ある条件を満たす要素を1つ取り出すには、detectメソッドを使用する※別名findメソッド。
条件を満たす要素を全て取り出して配列にするには、
find.allメソッドを使う※別名selectメソッド。
numbers = [1,2,3,4,5,6,7,8,9]
number = numbers.detect { |item| item > 5 } # 5より大きい数1つ
numbers2 = numbers.find_all { |item| item > 5 } # 5より大きい数全て
mapメソッド(別名collectメソッド)は、ブロックの戻り値を集めた新しい配列を作る。
※頻繁に使われるメソッド。
fruits = ["apple", "orange", "banana"]
big_fruits = fruits.map { |item| item.upcase }
p big_fruits
&:メソッド名という書き方
メソッドの引数に「&:method」を渡すと、
「{ |item| item.method }」渡すのとおなじになる。
big_fruits = fruits.map { |item| item.upcase }
big_fruits = fruits.map { &:upcase }
↑同じ意味。
今日はここまでにしとくか。
本記事は下記本の勉強記事です。初学者にとても良い本です。