Rubyの文法(C)

クラスとモジュール

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クラスのクラス、及び従って、例えばクラスオブジェクトインスタンス及びクラスメソッドの単一のメソッドは、クラスのオブジェクトです。

おすすめ

転載: www.cnblogs.com/liuzhongrong/p/11961110.html