LoginSignup
0
0

More than 1 year has passed since last update.

railsチュートリアル第4章 組み込みクラスの変更

Posted at

組み込みクラスの変更

継承を使わずに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"

正しく動いた。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0