2016-11-27 18 views
2

私が学んだのは、オブジェクト上の変数を呼び出すときです。Rubyのインスタンス変数にアクセス修飾子がありますか?

my_object.variable 

variable呼び出されたメソッドは、Javaにおいてvariable

def variable 
    @variable 
end 

の値を返す、アクセス修飾子があります。ゲッターメソッドの名前の後にRubyがアクセス修飾子を使用するにはどうすればいいですか?

答えて

7

まず、質問に答える前に、質問にクリーンアップする用語があります。

1つは、決して変数を「呼び出し」ないということです。 Rubyの表現

my_object.variable 

メソッド呼び出しです。可変コールのようなものはありません。メソッドではなく変数を呼び出します。メソッドがvariableの場合でも:)

二つ目は、あなたがこの

def variable 
    @variable 
end 

直接または

attr_reader :variable 

を言うことによってのようなメソッドを定義しなかった場合、あなたはvariableという名前のメソッドと@variableという名前の変数を持っています。

今質問に答えてください。

Rubyはアクセス修飾子publicprotected、およびメソッドだけでprivate、および変数のないを配置します。変数のアクセス制御は実際には意味がありません。なぜなら、オブジェクトのメソッド内でのみ参照され、接頭辞は使用されないからです。言い換えれば、これは決して書くことができません:

[email protected] 

これは単なる構文エラーです。書くことができます

obj.var 

ここで、varはメソッドの名前です。アクセス制御はそのメソッドにのみ適用されます。

同じ名前の変数とメソッドを作成している可能性があります(@を除く)ということは、実際問題ではありません。メソッドにはアクセスコントロールしかありません。

わかりやすい混乱を解消するのに役立ちます。

+0

ありがとうございます。 'my_object.variable'を実行すると、Javaで「変数を呼び出す」と言うことができますか?なぜ私はRubyでできないのか理解しています。 –

+1

あなたが "アクセス"と "はい"を意味するために "コール"を取る場合、それはほとんどの人が理解するでしょう。しかし、一般的に "関数呼び出し"と "メソッド呼び出し"について言えば、変数を記述するときにこの用語を避けるのが最善の方法です。しかし、人々はJavaであなたを理解するでしょうが、私は "アクセス"または "読む"は変数にとってより良いと思います。メソッドを呼び出すが、変数を読み込む。あなたが気づいたように、あなたは本当にRubyでそれを言うことができません。 :) RubyとJavaは実際にはかなり異なっています。 –

+0

技術的に言えば、インスタンス変数はクラスではなくオブジェクト(別名インスタンス)に属します。インスタンス変数は、異なるクラスではなく、異なる*オブジェクト*から見ることができます。 (たとえば、サブクラスまたはスーパークラスのメソッドから見ることができます) –

2

Rubyでメソッドを非公開にする方法はいくつかあります。

使用privateそれ以降のすべてのメソッドをプライベートにする:

class Foo 
    def public_method 
    end 

private 

    def private_method 
    end 
end 

それともあなたはそれを定義した後、方法はプライベート作る:

class Foo 
    def public_method 
    end 

    private :public_method # public_method is now private 
end 

または - メソッドの定義があまりにもシンボルを返すので、 - このも作品:

class Foo 
    private def method_name 
    end 
end 
関連する問題