수색…


소개

다양한 메소드, 데이터 멤버, 메소드 초기화에 대한 액세스 제어 (범위).

인스턴스 변수 및 클래스 변수

인스턴스 변수 란 무엇입니까? 먼저 객체의 속성과 비슷하게 동작합니다. 객체 생성시 초기화됩니다. 인스턴스 변수는 인스턴스 메소드를 통해 액세스 할 수 있습니다. 객체 당 인스턴스 변수가 있습니다. 인스턴스 변수는 객체간에 공유되지 않습니다.

시퀀스 클래스는 @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

object와 object1간에 공유됩니다.

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에서 비공개로 선언 된 경우 동일한 클래스 내의 다른 메소드에서만 메소드에 액세스 할 수 있습니다. 메소드가 보호 된 것으로 선언되면 동일한 패키지에있는 다른 클래스뿐만 아니라 다른 패키지에있는 클래스의 서브 클래스도 액세스 할 수 있습니다. 메소드가 공용 인 경우 모든 메소드에 표시됩니다. Java에서 액세스 제어 가시성 개념은 이러한 클래스가 상속 / 패키지 계층에있는 위치에 따라 다릅니다.

루비에서는 상속 계층 또는 패키지 / 모듈이 적합하지 않습니다. 모든 객체가 메소드의 수신자입니다 .

Ruby의 private 메서드의 경우 명시 적 수신기로 절대 호출 할 수 없습니다. 암묵적인 리시버를 사용하여 private 메소드를 (단지) 호출 할 수 있습니다.

이것은 또한이 클래스의 모든 서브 클래스뿐만 아니라 선언 된 클래스 내에서 private 메소드를 호출 할 수 있음을 의미합니다.

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.

보호 된 메서드 는 private와 같이 암시 적 수신기에서 호출 할 수 있습니다. 게다가 보호 된 메소드는 수신자가 "self"또는 "같은 클래스의 객체"인 경우 명시 적 수신자 (only)에 의해 호출 될 수 있습니다.

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

최대한의 가시성을 가진 Public 메소드 고려

개요

  1. 공개 : 퍼블릭 메소드가 최대한의 가시성을 갖습니다.

  2. Protected : 보호 된 메서드 는 private와 같이 암시 적 수신기에서 호출 할 수 있습니다. 게다가 보호 된 메소드는 수신자가 "self"또는 "같은 클래스의 객체"인 경우 명시 적 수신자 (only)에 의해 호출 될 수 있습니다.

  3. 비공개 : Ruby의 비공개 메소드의 경우 명시 적 수신자로 절대 호출 할 수 없습니다. 암묵적인 리시버를 사용하여 private 메소드를 (단지) 호출 할 수 있습니다. 이것은 또한이 클래스의 모든 서브 클래스뿐만 아니라 선언 된 클래스 내에서 private 메소드를 호출 할 수 있음을 의미합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow