クラスとモジュール
1.クラス
クラスは重要なオブジェクト指向の用語です。私たちは、抽象オブジェクトクラスとして見ることができ、そのようなすべてのオブジェクトは、これらの機能を持っています。ターゲットは、クラス、オブジェクトの実現である、オブジェクトクラスは、そのクラスの要件に従って作成されます。オブジェクトの挙動を決定するようなクラスは、オブジェクトのプロトタイプのようなものです。例えば:クラスの配列を使用してオブジェクトの配列を作成します
arr=Array.new #[]
クラスの方法では、そのクラスに属するオブジェクトを表示するには
arr=[1,2,3]
p arr.class #Array
p Array.class #Class
すべてのクラスは、クラス、クラスのオブジェクトです。
オブジェクトがクラスに属するかどうかを決定するとき、我々はinstance_of?メソッドを使用することができます。
arr=[1,2,3]
p arr.instance_of? Array #true
p arr.instance_of? Object #false
継承
クラスを拡張して新しいクラスを作成するには継承されるように作成されています。新しいクラスをサブクラスと呼ばれる継承した後に作成されます。継承されたクラスは親クラスと呼ばれています。
BasicObjectルビークラスは、すべてのクラスの親です。彼はルビー、最も基本的な機能として、オブジェクトを定義します。オブジェクトはBasicObjectのサブクラスです。一般的に必要なクラス定義機能。
逆継承はオブジェクトクラスがクラスに属するトレースするかどうかに応じて、のis_a?メソッドを使用することができます。
arr=[1,2,3]
p arr.is_a? Array #true
p arr.is_a? Object #true
クラスを作成します
class 类名
类的定义
end
クラス名の最初の文字は大文字に.egでなければなりません。
class Sayhello
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end
def hello
puts "hello,I am #{@name}!"
end
end
#实例化对象
java=Sayhello.new("java")
ruby=Sayhello.new
あなたがメソッドを呼び出すための新しいオブジェクトを作成するときにInitializeメソッドは、デフォルトで呼ばれています。場合は、インスタンス変数@name。方法の例ときハロー方法。インスタンス変数の方法としては、直接参照することができます。未定義のインスタンス変数を返しますnilに参照。
アクセサ
ruby中不能直接访问实例变量或对实例变量赋值。需要通过方法来操作。
class Sayhello
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end
def hello
puts "hello,I am #{@name}!"
end
#获取实例变量的方法
def name
puts "获取实例变量@name"
@name
end
#修改实例变量的方法
def name=(value)
puts "修改实例变量@name"
@name=value
end
end
#实例化对象
java=Sayhello.new("java") #调用initialize方法
p java.name #调用name方法
java.name="python" #调用name=方法
p java.name #调用name方法
java.hello #调用hello方法
Rubyは達成するために、より便利な方法を提供し、
定義|意味: - :|: - :attr_reader:名前|リードオンリー(定義されたメソッド名)attr_writer:名前|書き込み専用(定義名=法)attr_accessor:名前|読み書き(2つの方法が上記で定義された)例:
class Sayhello
#name和name=
attr_accessor :name
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end
def hello
puts "hello,I am #{@name}!"
end
end
#实例化对象
java=Sayhello.new("java") #调用initialize方法
p java.name #"java"
java.name="python"
p java.name #"python"
java.hello #hell0,I am python
自己特殊変数クラス自己内の例示的な方法の中に、自己は、メソッド呼び出しのインスタンスを参照し、クラス自体を指します。
class Sayhello
#name和name=
attr_accessor :name
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end
def hello
puts "hello,I am #{self.name}!"
end
end
#实例化对象
java=Sayhello.new("java") #调用initialize方法
java.hello #hell0,I am java
等価に
class Sayhello
#name和name=
attr_accessor :name
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end
def hello
puts "hello,I am #{@name}!"
end
end
#实例化对象
java=Sayhello.new("java") #调用initialize方法
java.hello #hell0,I am java
クラスメソッド
class Sayhello
class << Sayhello
def hello(name)
puts "#{name} said hello."
end
end
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end
def hello
puts "hello,I am #{@name}!"
end
end
#实例化对象
java=Sayhello.new("java") #调用initialize方法
java.hello #hell0,I am java
#调用类方法
Sayhello.hello "ruby" #ruby said hello;
クラスメソッド内で定義されたクラス
class Sayhello
class << self
def hello(name)
puts "#{name} said hello"
end
end
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end
def hello
puts "hello,I am #{@name}!"
end
end
#调用类方法
Sayhello.hello "ruby" #ruby said hello
若しくは
class Sayhello
def Sayhello.hello(name)
puts "#{name} said hello"
end
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end
def hello
puts 大专栏 Ruby grammer(三)s2">"hello,I am #{@name}!"
end
end
#调用类方法
Sayhello.hello "ruby" #ruby said hello
若しくは
class Sayhello
def self.hello(name)
puts "#{name} said hello"
end
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end
def hello
puts "hello,I am #{@name}!"
end
end
#调用类方法
Sayhello.hello "ruby" #ruby said hello
このように書かれた使用クラス«〜エンドクラス名のクラス定義は、クラス定義のシングルトンと呼ばれています。メソッドシングルトンクラス定義は、シングルトンと呼ばれるクラスのメソッドを定義しました。
定数は、定数を定義するクラス文の
class Sayhello
Version="1.0"
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end
def hello
puts "hello,I am #{@name}!"
end
end
#实例化对象
p Sayhello::Version #"1.0"
クラス変数すべてのクラスによって共有クラス・インスタンス変数、外部メモリは、クラスからのアクセスクラス変数に必要とされる直接定義するように、必要attr_accessor使用することはできません。
class Sayhello
@@count=0
def Sayhello.count
@@count
end
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end
def hello
@@count+=1
puts "hello,I am #{@name}!"
end
end
#实例化对象
p Sayhello.count #0
ruby=Sayhello.new
ruby.hello
java=Sayhello.new "java"
java.hello
p Sayhello.count #2
コール制限方法 Rubyはアクセスレベル3つのメソッドを提供します。
キーワード | アクセスレベル |
---|---|
パブリック | 外向き方法の形態に開示された方法の例 |
プライベート | それが唯一のクラス内で使用することができます |
保護されました | 内部クラスとサブクラスを使用することができます |
例えば:
class AccTest
def pub
puts "hello"
end
#设置方法的访问权限
public :pub
def priv
puts "private"
end
#设置方法的访问权限
private :priv
end
acc=AccTest.new
acc.pub
acc.priv #NoMethodError
希望均一な定義のアクセス方法の複数のレベル。あなたは、次の構文を使用することができます。例えば:
class AccTest
public #以下的方法都被定义为public
def pub
puts "hello"
end
private #以下方法都被定义为private
def priv
puts "private"
end
end
acc=AccTest.new
acc.pub
acc.priv #NoMethodError
アクセスレベルは、デフォルトの方法が公開されているが、初期化メソッドは例外で、彼は通常、民間のように定義されて定義されていません。
拡張クラス例:上の元のクラスにメソッドを追加します
class String
def count_word
#用空格分割self
ary=self.split(/s+/)
#返回分解后的数组的长度
return ary.size
end
end
str="I am ruby"
p str.count_word #3
継承
class 类名 < 父类名
类定义
end
例えば:RingArray継承された配列
class RingArray < Array
#重定义运算符[]
def[](i)
ind=i%self.size
super(ind)
end
end
arr=RingArray["金","木","水","火","土"]
p arr[6] #"木"
p arr[12] #"水"
クラス定義の場合は、親クラスを指定していない、ルビーデフォルトのクラスはObjectクラスのサブクラスです。時々、私たちはより軽量クラスを継承したい、クラスがBasicObjectなどに使用されます:クラスのインスタンスメソッドを見ます
p Object.instance_methods
p BasicObject.instance_methods
#[:!, :==, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__]
継承BasicObjectクラスする必要があり、我々は明示的に継承する必要があります。
undefをエイリアスとエイリアスがエイリアス方法を設定するために使用されている。再定義又は方法を既存の場合、エイリアスを使用して、元のメソッドを呼び出すために、別名を使用する必要があります。
alias 别名 原名
alias :别名 :原名
class Sayhello
def hello
"hello"
end
alias sayhello hello
end
h=Sayhello.new
p h.sayhello #"hello"
例えば:
class Sayhello
def hello
"hello"
end
alias sayhello hello
end
class Child < Sayhello
alias old_hello hello
def hello
"#{old_hello},again."
end
end
child=Child.new
p child.old_hello #"hello"
p child.hello #"hello,again."
undefを
undefを定義されているdeleteメソッドを使用。
undef 方法名
undef :方法名
例えば:サブクラスは親クラス定義されたメソッドを削除します
class Sayhello
def hello
"hello"
end
alias sayhello hello
def del
"delete"
end
end
class Child < Sayhello
alias old_hello hello
def hello
"#{old_hello},again."
end
undef del
end
child=Child.new
p child.old_hello #"hello"
p child.hello #"hello,again."
p child.del #NoMethodError
シングルトンクラスオブジェクトシングルトン使用は、方法に追加されます
str1="Ruby"
str2="Ruby"
class << str1
def hello
"hello,#{self}!"
end
end
p str1.hello #"hello,Ruby!"
p str2.hello #(NoMethodError)
すべてのオブジェクト・クラスのRubyクラスのクラス、及び従って、例えばクラスオブジェクトインスタンス及びクラスメソッドの単一のメソッドは、クラスのオブジェクトです。