####組み込みクラスの変更
継承を使わずにpalindrome?メソッドを直接実行できるのか?
>> "level".palindrome?
NoMethodError: undefined method `palindrome?' for "level":String
上のようにエラーになる。
Rubyでは組み込みの基本クラスの拡張が可能
Ruby のクラスはオープンで変更可能
クラス設計者でない開発者でもこれらのクラスにメソッドを自由に追加することが許されています。
>> class String
>> # 文字列が回文であればtrueを返す
>> def palindrome?
>> self == self.reverse
>> end
>> end
=> :String
>> "deified".palindrome?
=> true
真に正当な理由がない限り、組み込みクラスにメソッドを追加することは無作法
ailsの場合、組み込みクラスの変更を正当化できる理由
>> "".blank?
=> true
>> " ".empty?
=> false
>> " ".blank?
=> true
>> nil.blank?
=> true
文字列は空(empty)とは認識されない
が、空白(blank)
であると認識
Railsが実はblank?メソッドをStringクラスではなく、そのさらに上の基底クラスに追加していることが推測できる
###演習
1.メソッドを使い、回文かどうかを確認
>> class String
>> def palindrome?
>> self == reverse
>> end
>> end
=> :palindrome?
>> "racecar".palindrome?
=> true
>> "onomatopoeia".palindrome?
=> false
クラスでメソッドを定義しなければplindrome?
がエラーになる。
組み込みクラスとはこういうことだろうか?
2.クラスに新たなメソッドを追加
class String
>> def shuffle
>> self.split('').shuffle.join
>> end
>> end
=> :shuffle
>> "irohanihoheoto".shuffle
=> "ihieootorhnaho"
>> "irohanihoheoto".shuffle
=> "ihtenhhoooraoi"
>> "irohanihoheoto".shuffle
=> "oiroiaehhoothn"
3.作成したメソッドのself
を消しても正しく動くか確かめる
>> class String
>> def shuffle
>> split("").shuffle.join
>> end
>> end
=> :shuffle
>>
>> "irohanihoheoto".shuffle
=> "iernhthiaoooho"
>> "irohanihoheoto".shuffle
=> "aothnhhooroiie"
>> "irohanihoheoto".shuffle
=> "niheohoithroao"
>> "irohanihoheoto".shuffle
=> "hraionoheohoti"
正しく動いた。