Ruby Language
Ruby 액세스 수정 자
수색…
소개
다양한 메소드, 데이터 멤버, 메소드 초기화에 대한 액세스 제어 (범위).
인스턴스 변수 및 클래스 변수
인스턴스 변수 란 무엇입니까? 먼저 객체의 속성과 비슷하게 동작합니다. 객체 생성시 초기화됩니다. 인스턴스 변수는 인스턴스 메소드를 통해 액세스 할 수 있습니다. 객체 당 인스턴스 변수가 있습니다. 인스턴스 변수는 객체간에 공유되지 않습니다.
시퀀스 클래스는 @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 메소드 고려
개요
공개 : 퍼블릭 메소드가 최대한의 가시성을 갖습니다.
Protected : 보호 된 메서드 는 private와 같이 암시 적 수신기에서 호출 할 수 있습니다. 게다가 보호 된 메소드는 수신자가 "self"또는 "같은 클래스의 객체"인 경우 명시 적 수신자 (only)에 의해 호출 될 수 있습니다.
비공개 : Ruby의 비공개 메소드의 경우 명시 적 수신자로 절대 호출 할 수 없습니다. 암묵적인 리시버를 사용하여 private 메소드를 (단지) 호출 할 수 있습니다. 이것은 또한이 클래스의 모든 서브 클래스뿐만 아니라 선언 된 클래스 내에서 private 메소드를 호출 할 수 있음을 의미합니다.