第4章追加(写経)

irb(main):001:0> class MyClass < Array
irb(main):002:1>   def my_method
irb(main):003:2>     'Hello!'
irb(main):004:2>   end
irb(main):005:1> end
=> nil
irb(main):006:0> c = Class.new(Array) do
irb(main):007:1*   def my_method
irb(main):008:2>     'Hello!'
irb(main):009:2>   end
irb(main):010:1> end
=> #<Class:0x2c23f10>
irb(main):011:0> MyClass = c
(irb):11: warning: already initialized constant MyClass
=> MyClass
irb(main):012:0> c.name
=> "MyClass"
irb(main):013:0>

irb(main):013:0> str = "just a regular String"
=> "just a regular String"
irb(main):014:0> def str.title?
irb(main):015:1>   self.upcase == self
irb(main):016:1> end
=> nil
irb(main):017:0> str.title?
=> false
irb(main):018:0> str.methods.grep(/title?/)
=> [:title?]
irb(main):019:0> str.singleton_methods
=> [:title?]
irb(main):020:0> str2 = "JUST A TITLE"
=> "JUST A TITLE"
irb(main):021:0> def str2.title?
irb(main):022:1>   self.upcase == self
irb(main):023:1> end
=> nil
irb(main):024:0> str2.title?
=> true
irb(main):025:0>

irb(main):025:0> class C
irb(main):026:1>   def a_method
irb(main):027:2>     'C#a_method()'
irb(main):028:2>   end
irb(main):029:1> end
=> nil
irb(main):030:0> class D < C; end
=> nil
irb(main):031:0> obj = D.new
=> #<D:0x2c5b794>
irb(main):032:0> obj.a_method
=> "C#a_method()"
irb(main):033:0> class Object
irb(main):034:1>   def eigenclass
irb(main):035:2>     class << self; self; end
irb(main):036:2>   end
irb(main):037:1> end
=> nil
irb(main):038:0> "abc".eigenclass
=> #<Class:#<String:0x2c592b4>>
irb(main):039:0> class << obj
irb(main):040:1>   def a_singleton_method
irb(main):041:2>     'obj#a_singleton_method()'
irb(main):042:2>   end
irb(main):043:1> end
=> nil
irb(main):044:0> obj.eigenclass
=> #<Class:#<D:0x2c5b794>>
irb(main):045:0> obj.eigenclass.superclass
=> D
irb(main):046:0> class C
irb(main):047:1>   class << self
irb(main):048:2>     def a_class_method
irb(main):049:3>       'C.a_class_method()'
irb(main):050:3>     end
irb(main):051:2>   end
irb(main):052:1> end
=> nil
irb(main):053:0> C.eigenclass
=> #<Class:C>
irb(main):054:0> C.class
=> Class
irb(main):055:0> D.eigenclass
=> #<Class:D>
irb(main):056:0> D.class
=> Class
irb(main):057:0> D.eigenclass.class
=> Class
irb(main):058:0> C.eigenclass.class
=> Class
irb(main):059:0> D.eigenclass.superclass
=> #<Class:C>
irb(main):060:0> C.eigenclass.superclass
=> #<Class:Object>
irb(main):061:0> D.a_class_method
=> "C.a_class_method()"

irb(main):062:0> class MyClass
irb(main):063:1>   attr_accessor :a
irb(main):064:1> end
=> nil
irb(main):065:0> obj = MyClass.new
=> []
irb(main):066:0> obj.a = 2
=> 2
irb(main):067:0> obj.a
=> 2
irb(main):068:0> class MyClass
irb(main):069:1>   class << self
irb(main):070:2>     attr_accessor :c
irb(main):071:2>   end
irb(main):072:1> end
=> nil
irb(main):073:0> MyClass.c = 'It works!'
=> "It works!"
irb(main):074:0> MyClass.c
=> "It works!"