サーチ…


前書き

さまざまなメソッド、データメンバー、メソッドの初期化にアクセス制御(スコープ)。

インスタンス変数とクラス変数

最初に、 インスタンス変数とは何かを刷新しましょう。オブジェクトのプロパティとよく似た動作をします。それらはオブジェクト作成時に初期化されます。インスタンス変数はインスタンスメソッドからアクセスできます。オブジェクトごとにインスタンス変数があります。インスタンス変数はオブジェクト間で共有されません。

シーケンスクラスには、インスタンス変数として@from、@to、@byがあります。

class Sequence
    include Enumerable

    def initialize(from, to, by)
        @from = from
        @to = to
        @by = by
    end

    def each
        x = @from
        while x < @to
            yield x
            x = x + @by
        end
    end

    def *(factor)
        Sequence.new(@from*factor, @to*factor, @by*factor)
    end

    def +(offset)
        Sequence.new(@from+offset, @to+offset, @by+offset)
    end
end

object = Sequence.new(1,10,2)
object.each do |x|
    puts x
end

Output:
1
3
5
7
9

object1 = Sequence.new(1,10,3)
object1.each do |x|
    puts x
end

Output:
1
4
7

クラス変数クラス変数を、そのクラスのさまざまなオブジェクト間で共有されるjavaの静的変数と同じように扱います。クラス変数はヒープメモリに格納されます。

class Sequence
    include Enumerable
    @@count = 0
    def initialize(from, to, by)
        @from = from
        @to = to
        @by = by
        @@count = @@count + 1
    end

    def each
        x = @from
        while x < @to
            yield x
            x = x + @by
        end
    end

    def *(factor)
        Sequence.new(@from*factor, @to*factor, @by*factor)
    end

    def +(offset)
        Sequence.new(@from+offset, @to+offset, @by+offset)
    end

    def getCount
        @@count
    end
end

object = Sequence.new(1,10,2)
object.each do |x|
    puts x
end

Output:
1
3
5
7
9

object1 = Sequence.new(1,10,3)
object1.each do |x|
    puts x
end

Output:
1
4
7

puts object1.getCount
Output: 2

オブジェクトとオブジェクトの間で共有されます。

RubyのJavaに対するインスタンス変数とクラス変数の比較:

Class Sequence{
    int from, to, by;
    Sequence(from, to, by){// constructor method of Java is equivalent to initialize method of ruby
        this.from = from;// this.from of java is equivalent to @from indicating currentObject.from
        this.to = to;
        this.by = by;
    }
    public void each(){
        int x = this.from;//objects attributes are accessible in the context of the object.
        while x > this.to
            x = x + this.by
    }
}

アクセス制御

Rubyに対するJavaのアクセス制御の比較:メソッドがJavaでprivateと宣言されている場合、そのメソッドは同じクラス内の他のメソッドによってのみアクセスできます。メソッドが保護されていると宣言されている場合は、同じパッケージ内に存在する他のクラスだけでなく、別のパッケージ内のクラスのサブクラスによってもアクセスできます。メソッドが公開されていると、誰もが見ることができます。 Javaでは、アクセス制御の可視性の概念は、これらのクラスが継承/パッケージ階層内のどこにあるかによって異なります。

Rubyでは、継承階層やパッケージ/モジュールが適合しません。 どのオブジェクトがメソッドのレシーバであるかはすべてです。

Rubyのプライベートメソッドの場合、明示的なレシーバで呼び出すことはできません。私たちは暗黙的な受信者でプライベートメソッドを(唯一)呼び出すことができます。

これはまた、宣言されているクラスの中からこのクラスのすべてのサブクラスからプライベートメソッドを呼び出すことができることを意味します。

class Test1
  def main_method
    method_private
  end

  private
  def method_private
    puts "Inside methodPrivate for #{self.class}"
  end
end

class Test2 < Test1
  def main_method
    method_private
  end
end

Test1.new.main_method
Test2.new.main_method

Inside methodPrivate for Test1
Inside methodPrivate for Test2

class Test3 < Test1
  def main_method
    self.method_private #We were trying to call a private method with an explicit receiver and if called in the same class with self would fail.
  end
end

Test1.new.main_method
This will throw NoMethodError

You can never call the private method from outside the class hierarchy where it was defined.

保護されたメソッドは、暗黙的な受信者と共に呼び出すことができます。さらに、保護されたメソッドは、受信者が「自己」または「同じクラスのオブジェクト」である場合は、明示的な受信者(のみ)によって呼び出すこともできます。

class Test1
  def main_method
    method_protected
  end

  protected
  def method_protected
    puts "InSide method_protected for #{self.class}"
  end
end

class Test2 < Test1
  def main_method
    method_protected # called by implicit receiver
  end
end

class Test3 < Test1
  def main_method
    self.method_protected # called by explicit receiver "an object of the same class"
  end
end


InSide method_protected for Test1
InSide method_protected for Test2
InSide method_protected for Test3


class Test4 < Test1
  def main_method
    Test2.new.method_protected # "Test2.new is the same type of object as self"
  end
end

Test4.new.main_method

class Test5
  def main_method
    Test2.new.method_protected
  end
end

Test5.new.main_method
This would fail as object Test5 is not subclass of Test1

最大の可視性を備えたパブリックメソッドを検討する

概要

  1. 公開:パブリックメソッドは最大の可視性を持ちます

  2. Protected: 保護されたメソッドは、暗黙的な受信者と共に呼び出すことができます。さらに、保護されたメソッドは、受信者が「自己」または「同じクラスのオブジェクト」である場合は、明示的な受信者(のみ)によって呼び出すこともできます。

  3. 非公開: Rubyのプライベートメソッドの場合 、明示的な受信者で呼び出すことはできません。私たちは暗黙的な受信者でプライベートメソッドを(唯一)呼び出すことができます。これはまた、宣言されているクラスの中からこのクラスのすべてのサブクラスからプライベートメソッドを呼び出すことができることを意味します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow