ruby baseなどとオブジェクト

7946 ワード

1、定義
あるクラスが定義された場合、同じクラス名で定義され、既存のクラスを追加することを意味します(同じクラスを再定義する場合、既存の定義を補完することを意味し、元の定義を上書きしません.再定義方法の場合、既存の定義を上書きします.
)
2、変数
rubyでは,メソッドのみがインスタンス変数を操作できるため,Rubyでのパッケージングは強制的であるといえる.オブジェクトの外部に直接アクセスすることはできません.インタフェースメソッドでのみアクセスできます.
class Person
  def name
    @name
  end
  def gender
    @gender
  end
  def age
    @age
  end
end

people = Person.new('Tom', 'male', 15)
puts people.name
puts people.gender
puts people.age

Rubyでは、オブジェクトの内部プロパティはすべてプライベートです.上記のコードでは,Personクラスインスタンスオブジェクトにアクセスするためのメソッドname,gender,ageの3つのメソッドのインスタンス変数を定義した.注意name,gender,ageアクセスは、対応するインスタンス変数のみを読み込むことができ、値を変更することはできません.
メンバー変数読み取り専用制御子attr_を使用することもできます.readerは同じ効果を達成します.
class Person
  attr_reader :name, :gender, :age
end

同様に、メンバー変数の値を変更する方法を定義できます.
class Person
  def name=(name)
    @name=name
  end
  def gender=(gender)
    @gender=gender
  end
  def age=(age)
    @age=age
  end
end

people = Person.new('Tom', 'male', 15)
people.name = "Henry"
people.gender = "male"
people.age = 25

メンバー変数で制御子attr_を書くこともできます.writerは同じ効果を達成します.
class Person
  attr_writer :name, :gender, :age
end

attr_も使えますアクセス者は、メンバー変数が読み書き可能であることを説明します.
class Person
  attr_accessor :name, :gender, :age
end

attrコントローラを使用して、変数が読み書きできるかどうかを制御することもできます.attrは1つのシンボルパラメータしか持たず、2番目のパラメータはboolパラメータであり、シンボルパラメータに対して書き込み方法を生成するかどうかを示す.デフォルト値はfalseで、読み取り方法のみが生成され、書き込み方法は生成されません.
class Person
  attr :name, true #  
  attr :gender, true #  
  attr :age, true #  
  attr :id, false #  
end

注意attr_reader,attr_writer,attr_accessorとattrは言語のキーワードではなくModuleモジュールの方法です.
class Test
  attr_accessor :value
end
puts Test.instance_methods - Test.superclass.public_methods
#     :
value
value=

上のコードではTestを使用しています.instance_methodsはTestクラスのすべての実例方法を得て、Testを使用する.superclass.public_methodsはTest親クラスのすべてのインスタンスメソッドを得,その後減算してTestクラスが親クラスを含まないすべてのインスタンスメソッドを得る.
instance_methodsメソッドの戻り値はArrayなので、差分演算を行います.
3、特殊方法と特殊類
特殊な方法とは、あるインスタンス特有の方法を指す.1つのオブジェクトにどのような動作があるかは、対向するクラスによって決まりますが、特殊なオブジェクトの中には他のオブジェクトとは異なる動作がある場合があります.多くのプログラム設計言語では、C++やJavaなど、新しいクラスを定義する必要がありますが、Rubyでは特定のオブジェクトにのみ属する方法を定義することができます.この方法は特別な方法(Singleton Method)となる.
class SingletonTest
  def info
    puts "This is This is SingletonTest method"
  end
end
obj1 = SingletonTest.new
obj2 = SingletonTest.new
def obj2.info
  puts "This is obj2"
end
obj1.info
obj2.info
     :
This is This is SingletonTest method
This is obj2

オブジェクトに一連の特殊なメソッドを定義する必要がある場合があります.前のメソッドでは、1つの定義しかできません.
def obj2.singleton_method1
end
def obj2.singleton_method2
end

def obj2.singleton_method3
end
……
def obj2.singleton_methodn
end

これは非常に煩雑で、統一的な概念モデルを与えることができないため、Rubyは別の方法を提供しています.
class << obj
  ……
end

objは、class<<がその特殊なクラスを表す特定のオブジェクトインスタンスです.
class SingletonTest
  def meth1
    puts "This is meth1"
  end
  def meth2
    puts "This is meth2"
  end
end

obj1 = SingletonTest.new
obj2 = SingletonTest.new

class << obj2
  def meth1
    puts "This is obj2's meth1"
  end
  def meth2
    puts "This is obj2's meth2"
  end
end
obj1.meth1
obj1.meth2
obj2.meth1
obj2.meth2
     :
This is meth1
This is meth2
This is obj2's meth1
This is obj2's meth2

4、クラス変数とクラス方法
1)クラス変数は使用前に初期化しなければならず、クラス変数は使用前に初期化しなければならない.クラス変数はプライベートで、クラス外では直接アクセスできません.インスタンスメソッドとクラスメソッドでのみアクセスできます.
同様に,クラスメソッドはクラスに属するメソッドであり,クラスメソッドを定義する際にメソッドの前にクラス名を付ける必要がある.
2)RubyとC++/Javaの大きな違いは,アクセス制御がプログラム実行時に決定され,静的バインディングではないことである.したがって、実行時エラーは、制限されたメソッドにアクセスした場合にのみ発生します.
3)方法のアクセス制御は3種類ある:
パブリックメソッド
メソッドはどこでも呼び出すことができます.これはメソッドのデフォルトアクセス制御です.initializeとinitializeを除くcpoyメソッド、彼らは永遠にプライベートメソッドです.
保護方法(Protected Method)
メソッドは、このメソッドを定義するクラス独自のオブジェクトと、このクラスのサブクラスのオブジェクトのみにアクセスできます.
プライベートメソッド(private Method)
メソッドは、このメソッドを定義したクラスのオブジェクトのみが自分でアクセスでき、このクラスの他のオブジェクトでもアクセスできません.
Rubyにおける保護方法とプライベートメソッドは一般的にオブジェクト向けプログラミング言語の概念とは異なり,保護メソッドはメソッドがこのメソッドを定義するクラス独自のオブジェクトとサブクラスのオブジェクトのみがアクセスできることを意味し,プライベートメソッドはオブジェクト自身にのみ質問される.
class Test
  def method1 #       
    …
  end
  protected #    
  def method2
    …
  end
  private #    
  def method3
  end
  public
  def test_protected(arg) #arg Test    
    arg.method2 #  ,               
  end
  def test_private(arg) #arg Test    
    arg.method3 #  ,               
  end
end

obj1 = Test.new
obj2 = Test.new
obj1.test_protected(obj2)
obj1.test_private(obj2)

以下の簡単な形式も使用できます.
class Test
  def method1
    ...
  end
  def method2
    ...
  end
  def method3
    ...
  end
  def methdo4
    ...
  end
  public :method1
  protected :method2
  private :method3, :method4
end

RubyとC++/Javaの顕著な違いは,アクセス制御がプログラム実行時に決定され,静的バインドではないことである.したがって、実行時エラーは、制限されたメソッドにアクセスした場合にのみ発生します.
5、メタクラス
ルビーではすべて対象です.クラスとインスタンスオブジェクトはすべてオブジェクトです.この言葉は少し言いにくいように聞こえますが、例を見てみましょう.
class Person
  def initialize(name, gender, age)
    @name = name
    @gender = gender
    @age = age
  end
end
a = Person.new('Tom', 'male', 15)
puts a.object_id => 22429840
puts Person.object_id => 22429960

そう、クラスもオブジェクトです.これはRubyとC++/Javaの著しい違いです.C+/Javaでは、クラスはデータ抽象にすぎず、クラスもオブジェクトという概念はありません.Rubyにはメタクラスの概念が存在し,クラスもオブジェクトであり,すべてのクラスがメタクラスのインスタンスオブジェクトである.RubyはC+/Javaに比べてオブジェクト指向度が高い.
クラスオブジェクトはインスタンスオブジェクトと同様に独自のojbect_を持っていることがわかります.idは、インスタンスオブジェクトを呼び出す方法のようにクラスメソッドを呼び出すことができます.すべてのクラスオブジェクトのクラスはClassクラス、Objectクラスはすべてのクラスのベースクラスです.
irb(main):003:0> Object.class
=> Class
irb(main):004:0> Object.superclass
=> BasicObject
irb(main):004:0> BasicObject.superclass
=> 

このように、クラス変数とクラスメソッドを別の角度から理解することができます.クラス変数はクラスオブジェクトのインスタンス変数であり、クラスメソッドはクラスオブジェクトクラスの特殊な方法を指します.
クラスメソッドは、特に2つに分けることができます.1つ目は、すべてのクラスの親クラスクラスで定義され、すべてのクラスで共有されるメソッドです.2つ目は,各クラス特有の特殊な方法である.
クラスメソッドのselfはクラス自体を指すので、クラスメソッドをさまざまな方法で定義できることを覚えておく必要があります.
class Test
  #       1
  def Test.meth1
    # ...
  end
  #       2
  def self.meth2
    # ...
  end

  #       3         
  class << Test
    def meth3
      # ...
    end
  end
  #       4
  class << self
    def meth4
      # ...
    end
  end
end

6、ルビーのダイナミック性
class UndefTest
  def meth
    puts "This is meth"
  end
end
obj1 = UndefTest.new
obj1.meth
class UndefTest
  undef_method(:meth)  undef meth
end
obj1.meth
     :
This is meth
test.rb:14: undefined method `meth' for #<UndefTest:0x2ac8240> (NoMethodError)