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
オブジェクトとオブジェクトの間で共有されます。
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
最大の可視性を備えたパブリックメソッドを検討する
概要
公開:パブリックメソッドは最大の可視性を持ちます
Protected: 保護されたメソッドは、暗黙的な受信者と共に呼び出すことができます。さらに、保護されたメソッドは、受信者が「自己」または「同じクラスのオブジェクト」である場合は、明示的な受信者(のみ)によって呼び出すこともできます。
非公開: Rubyのプライベートメソッドの場合 、明示的な受信者で呼び出すことはできません。私たちは暗黙的な受信者でプライベートメソッドを(唯一)呼び出すことができます。これはまた、宣言されているクラスの中からこのクラスのすべてのサブクラスからプライベートメソッドを呼び出すことができることを意味します。