クリップボードにコピー

TwitterFacebook

パブリック、プライベート、保護されたアクセス-すべてのプログラマはその概念に精通 特別なものは何も、私たちは日常的に彼らと協力していません。 しかし、Rubyプログラマとして、私たちは本当に詳細を知っていますか?あなたはこれらの5つの声明で自分自身をチェックすることができます。

答えてみてください:真または偽。

ステートメント:

  1. パブリックメソッドにはアクセス制御がありません-そのクラスのインスタンスまたはサブクラスによってクラス定義の外部から呼び出すこ
  2. protectedメソッドとprivateメソッドの両方を、定義するクラスの外部から呼び出すことはできません。
  3. 保護されたメソッドはサブクラスからアクセスでき、プライベートメソッドはアクセスできません。
  4. 定義するクラスのプライベートメソッドは、そのクラスの任意のインスタンスで呼び出すことができます。
  5. パブリックアクセスはデフォルトのアクセスです。

この記事の最後に正しい答えに戻ります。 ここでは、パブリック、プライベート、および保護されたアクセス制御のいくつかのニュアンスに それをより実用的にするために、私は遊ぶためのサンプルコードを用意しました。 私は記事を簡単に続けるためにこのレポを複製することをお勧めします。 それはただのファイルです。 最初に解決策を考えたい場合は、コードの実行を保留します。あなたは、基本クラスを見ることができますRegionCountryCityCityCountryRegionから継承します。 継承は、公開、非公開、および保護された詳細を示すために使用されます。 ファイルの最後に、初期化部分と以下で説明する4つのセクションを見つけることができます。 コードに慣れるためにファイルを見てみましょう。

さあ始めましょう!

wroclawsan_franciscopoland。 これらのオブジェクトは、今後のセクションでデモの目的で使用されます。 私はこれらすべてのセグメントを別々に扱うことをお勧めします。 次のセクションに進む前に、特定のセクションをコメントアウトすることができます。 このようにして、エラーは残りの出力をブロックしません。

Iセクション

トピック:パブリックアクセス。

最初のセクションでgreetingwroclawpolandpolandwroclaw)にアクセスできます。P>

Hello, I'm Wrocław! 638000 people live here.Hello, I'm Poland! 38000000 people live here.

結論:パブリックアクセスは明らかで直感的です。 制限はありません。 また、これはデフォルトのアクセス修飾子です。

IIセクション

トピック:定義するクラスの外部からprivateメソッドとprotectedメソッドにアクセスします。そのセクションには、protectedname_infoとprivatepopulation_infowroclawNoMethodErrorがスローされます。P>

protected method `name_info' called for #<City:0x...> (NoMethodError)private method `population_info' called for #<City:0x...> (NoMethodError)

結論:プライベートメソッドと保護されたメソッドは、クラスの外部から呼び出すことはできません。 アクセスは制限されています。

IIIセクション

トピック:定義するクラスの内部からプライベートメソッドと保護されたメソッドへのアクセス。今回はCity::own_greetingname_infoCountry::own_greetingpopulation_info)。 Privateメソッドとprotectedメソッドの両方が(継承されていても)クラス内でアクセスできます。 プライベートと保護されたアクセスを区別するのはポイントではありません。結論:プライベートメソッドと保護されたメソッドは、定義クラスの内部から呼び出すことができます。 アクセスは許可されています。

IVセクション

トピック:プライベートメソッドと保護されたメソッドの実際の違い。

IVセクション-より多くの予期しないルールがここに表示され始める可能性があります。あなたはそこに3つのパブリックメソッドを見ることができます:

  • more_densely_populated?(other_region)-それはprivatepopulation_densitycontinentconsider_as_densely_populated?を使用します。

コードを段階的に見てみましょう。

more_densely_populated?(other_region)

wroclaw.more_densely_populated?(san_francisco)=> private method `population_density' called for #<City:0x...> (NoMethodError)

うーん、それは面白いです。 プライベートメソッドRegion::population_densityRegionクラス内で実装されていても、呼び出されていません。 同様のシナリオはIIIセクションで働いています…

the_same_continent?(other_region)

wroclaw.the_same_continent?(san_francisco)=> Wrocław and San Francisco lie in the different continents.

これは動作します。 ここで何か違いはありますか? 右、the_same_continent?continent。 さて、続けましょう。

できますか?

できますか?

できますか?p>

san_francisco.can_be_crowdy?=> private method `consider_as_densely_populated?' called for #<City:0x...> (NoMethodError)

NoMethodErrorcan_be_crowdy?consider_as_densely_populated?メソッドを使用します。 同様の状況は、IIIセクションで正常に動作していました。 それでここで何が起こっているの?それはすべての受信機についてです。

それはすべての受信機についてです。

基本的に、受信者はメソッドが呼び出されるオブジェクトです。 例にまっすぐに行きましょう:

  • other_region.population_density ?other_regionother_regionです。
  • self.consider_as_densely_populated?selfです。そして、ここに重要なものがあります、そのルールを覚えておいてください:

    プライベートメソッドは明示的な受信機で呼び出すp>

    ここでは”明示的”という言葉に注意してください。 このステートメントを単純化する-object.some_methodsome_methodを使用する必要があります。 後者の場合、Rubyは暗黙的な受信機を使用します。selfselfself.some_method、それはまだ明示的な受信者であり、ルールはルールです:)

    :/p>

    • other_region.population_density ?NoMethodError
    • other_region.continent-明示的な受信機が存在し、属性が保護されています-OK
    • self.consider_as_densely_populated?-明示的な受信機が存在し、メソッドはprivateです-NoMethodError

    結論:これはprivateとprotectedの間の実際の区別です。 プライベートメソッドは明示的な受信機で呼び出すことはできず、保護されたメソッド 私の経験によると、保護されたメソッドはRubyコード行の中ではほとんど使用されませんが、属性へのアクセスを制限したいが、比較メソッドでそれを使アクセス制御ルールがはるかに明確になったことを願っています。

    あなたがまだそれをしていなければ、コードであなたの手を汚すことをお勧めします。 理論は、それが証明されていない場合は忘れて取得する傾向があります。最後に、私が約束したように-声明への答え:

    1. TRUE
    2. TRUE
    3. FALSE
    4. FALSE
    5. TRUE

    Summary

    この記事を書いたのは、Rubyでパブリック、プライベート、保護されたアクセスが実際にどのよ 最も単純なことは理解するのが最も難しいか、少なくともそうすることができます。 私は本当にこの記事があなたのために参考になったことを願っています。 あるいは、あなたはそれを読む前にアクセスルールを知っていました。 コメントで自分の考えを共有し、私はそれらの非常に興味があります。 あなたもdocsを見てみることができます。 あなたはそこにすべてのこれらの詳細を見つけるでしょう :p>

    join

    join

コメントを残す

メールアドレスが公開されることはありません。