ruby baseなどとオブジェクト
7946 ワード
1、定義
あるクラスが定義された場合、同じクラス名で定義され、既存のクラスを追加することを意味します(同じクラスを再定義する場合、既存の定義を補完することを意味し、元の定義を上書きしません.再定義方法の場合、既存の定義を上書きします.
)
2、変数
rubyでは,メソッドのみがインスタンス変数を操作できるため,Rubyでのパッケージングは強制的であるといえる.オブジェクトの外部に直接アクセスすることはできません.インタフェースメソッドでのみアクセスできます.
Rubyでは、オブジェクトの内部プロパティはすべてプライベートです.上記のコードでは,Personクラスインスタンスオブジェクトにアクセスするためのメソッドname,gender,ageの3つのメソッドのインスタンス変数を定義した.注意name,gender,ageアクセスは、対応するインスタンス変数のみを読み込むことができ、値を変更することはできません.
メンバー変数読み取り専用制御子attr_を使用することもできます.readerは同じ効果を達成します.
同様に、メンバー変数の値を変更する方法を定義できます.
メンバー変数で制御子attr_を書くこともできます.writerは同じ効果を達成します.
attr_も使えますアクセス者は、メンバー変数が読み書き可能であることを説明します.
attrコントローラを使用して、変数が読み書きできるかどうかを制御することもできます.attrは1つのシンボルパラメータしか持たず、2番目のパラメータはboolパラメータであり、シンボルパラメータに対して書き込み方法を生成するかどうかを示す.デフォルト値はfalseで、読み取り方法のみが生成され、書き込み方法は生成されません.
注意attr_reader,attr_writer,attr_accessorとattrは言語のキーワードではなくModuleモジュールの方法です.
上のコードではTestを使用しています.instance_methodsはTestクラスのすべての実例方法を得て、Testを使用する.superclass.public_methodsはTest親クラスのすべてのインスタンスメソッドを得,その後減算してTestクラスが親クラスを含まないすべてのインスタンスメソッドを得る.
instance_methodsメソッドの戻り値はArrayなので、差分演算を行います.
3、特殊方法と特殊類
特殊な方法とは、あるインスタンス特有の方法を指す.1つのオブジェクトにどのような動作があるかは、対向するクラスによって決まりますが、特殊なオブジェクトの中には他のオブジェクトとは異なる動作がある場合があります.多くのプログラム設計言語では、C++やJavaなど、新しいクラスを定義する必要がありますが、Rubyでは特定のオブジェクトにのみ属する方法を定義することができます.この方法は特別な方法(Singleton Method)となる.
オブジェクトに一連の特殊なメソッドを定義する必要がある場合があります.前のメソッドでは、1つの定義しかできません.
これは非常に煩雑で、統一的な概念モデルを与えることができないため、Rubyは別の方法を提供しています.
objは、class<<がその特殊なクラスを表す特定のオブジェクトインスタンスです.
4、クラス変数とクラス方法
1)クラス変数は使用前に初期化しなければならず、クラス変数は使用前に初期化しなければならない.クラス変数はプライベートで、クラス外では直接アクセスできません.インスタンスメソッドとクラスメソッドでのみアクセスできます.
同様に,クラスメソッドはクラスに属するメソッドであり,クラスメソッドを定義する際にメソッドの前にクラス名を付ける必要がある.
2)RubyとC++/Javaの大きな違いは,アクセス制御がプログラム実行時に決定され,静的バインディングではないことである.したがって、実行時エラーは、制限されたメソッドにアクセスした場合にのみ発生します.
3)方法のアクセス制御は3種類ある:
パブリックメソッド
メソッドはどこでも呼び出すことができます.これはメソッドのデフォルトアクセス制御です.initializeとinitializeを除くcpoyメソッド、彼らは永遠にプライベートメソッドです.
保護方法(Protected Method)
メソッドは、このメソッドを定義するクラス独自のオブジェクトと、このクラスのサブクラスのオブジェクトのみにアクセスできます.
プライベートメソッド(private Method)
メソッドは、このメソッドを定義したクラスのオブジェクトのみが自分でアクセスでき、このクラスの他のオブジェクトでもアクセスできません.
Rubyにおける保護方法とプライベートメソッドは一般的にオブジェクト向けプログラミング言語の概念とは異なり,保護メソッドはメソッドがこのメソッドを定義するクラス独自のオブジェクトとサブクラスのオブジェクトのみがアクセスできることを意味し,プライベートメソッドはオブジェクト自身にのみ質問される.
以下の簡単な形式も使用できます.
RubyとC++/Javaの顕著な違いは,アクセス制御がプログラム実行時に決定され,静的バインドではないことである.したがって、実行時エラーは、制限されたメソッドにアクセスした場合にのみ発生します.
5、メタクラス
ルビーではすべて対象です.クラスとインスタンスオブジェクトはすべてオブジェクトです.この言葉は少し言いにくいように聞こえますが、例を見てみましょう.
そう、クラスもオブジェクトです.これはRubyとC++/Javaの著しい違いです.C+/Javaでは、クラスはデータ抽象にすぎず、クラスもオブジェクトという概念はありません.Rubyにはメタクラスの概念が存在し,クラスもオブジェクトであり,すべてのクラスがメタクラスのインスタンスオブジェクトである.RubyはC+/Javaに比べてオブジェクト指向度が高い.
クラスオブジェクトはインスタンスオブジェクトと同様に独自のojbect_を持っていることがわかります.idは、インスタンスオブジェクトを呼び出す方法のようにクラスメソッドを呼び出すことができます.すべてのクラスオブジェクトのクラスはClassクラス、Objectクラスはすべてのクラスのベースクラスです.
このように、クラス変数とクラスメソッドを別の角度から理解することができます.クラス変数はクラスオブジェクトのインスタンス変数であり、クラスメソッドはクラスオブジェクトクラスの特殊な方法を指します.
クラスメソッドは、特に2つに分けることができます.1つ目は、すべてのクラスの親クラスクラスで定義され、すべてのクラスで共有されるメソッドです.2つ目は,各クラス特有の特殊な方法である.
クラスメソッドのselfはクラス自体を指すので、クラスメソッドをさまざまな方法で定義できることを覚えておく必要があります.
6、ルビーのダイナミック性
あるクラスが定義された場合、同じクラス名で定義され、既存のクラスを追加することを意味します(同じクラスを再定義する場合、既存の定義を補完することを意味し、元の定義を上書きしません.再定義方法の場合、既存の定義を上書きします.
)
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)