インクルードされたモジュールは親クラスのインスタンス変数を呼び出すことができません

トラン・キム・ドゥ

たとえば、インスタンス変数を定義したクラスがあります。

 class ApplicationApi < Grape::API
    include WithGrapeLogging
    @api_environment_name = "Android"
  end

これが私のカスタム モジュールです。このカスタム モジュールでは、上記のクラスのインスタンス変数を呼び出しました。

require 'grape_logging'
module WithGrapeLogging
  extend ActiveSupport::Concern
  included do
      logger.formatter = GrapeLogging::Formatters::Default.new

      use GrapeLogging::Middleware::RequestLogger,
        logger: logger,
        formatter: GrapeLoggerFormatter.new(@api_environment_name),
        include: [ GrapeLogging::Loggers::Response.new,
                   GrapeLogging::Loggers::FilterParameters.new,
                   GrapeLogging::Loggers::ClientEnv.new,
                   GrapeLogging::Loggers::RequestHeaders.new ]
  end
end

その変数が null かどうかはわかりません。方法を教えてください。

小さい

Module#includeメソッドのソース コードを見てみましょう

               static VALUE
rb_mod_include(int argc, VALUE *argv, VALUE module)
{
    int i;
    ID id_append_features, id_included;

    CONST_ID(id_append_features, "append_features");
    CONST_ID(id_included, "included");

    for (i = 0; i < argc; i++)
        Check_Type(argv[i], T_MODULE);
    while (argc--) {
        rb_funcall(argv[argc], id_append_features, 1, module);
        rb_funcall(argv[argc], id_included, 1, module);
    }
    return module;
}

に渡された引数ごとに、(経由して) にModule#include渡されたブロックを呼び出していることがわかります。includedrb_funcall

とき、あなたはincludeあなたのクラス定義の2行目に、あなたのモジュールは、それが提供するブロック呼び出してincluded、あなたのモジュール定義では。そのブロックを実行しているときに、Ruby@api_environment_nameは定義されていないものを識別し、エラーをスローします。そのインスタンス変数の定義をモジュールの前に置くinclude、モジュールはそれを認識します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

クラスのインスタンス変数を呼び出すことができませんか?

分類Dev

Pythonでは、スクリプトによってインポートされたモジュール内からスクリプトの関数をどのように呼び出すことができますか?

分類Dev

AngularJs:子モジュールのディレクティブでリンクされた関数を呼び出すことができませんか?

分類Dev

別のモジュールで設定されたクラスインスタンス変数にアクセスできません

分類Dev

puppetはインストールされたモジュールapacheからクラスを見つけることができません

分類Dev

親クラスの関数がclassmethodまたはインスタンスメソッドによって子クラスから呼び出されていることをどのように知ることができますか?

分類Dev

スーパータイプコンストラクターが呼び出される前は "X"を参照できません。xは最終変数です

分類Dev

Java:スーパータイプコンストラクターが呼び出される前に高さを参照することはできません

分類Dev

アンドロイドエミュレーターを回転させて向きをランドスケープモードまたはポトレイトモードに変更すると、「OnSizeAllocated」が呼び出されません

分類Dev

python-スクリプトでは関数を呼び出すことはできませんが、インタラクティブモードでは呼び出すことができます

分類Dev

django-rest-framework:シリアライザーインスタンスのインスタンス化時に `data =`キーワード引数が渡されなかったため、 `.is_valid()`を呼び出すことができません

分類Dev

MVCパターン、モデルクラスは、配列の作成に使用されるイニシエーターの1つを呼び出すことができません

分類Dev

シリアライザインスタンスのインスタンス化時に `data =`キーワード引数が渡されなかったため、 `.is_valid()`を呼び出すことができません

分類Dev

そのクラスのオブジェクトが作成されたときにコンストラクターがメモリを取得する外部で関数がクリアされていますか。関数が呼び出されていません

分類Dev

オブジェクトがインスタンス化されたときに親コンストラクターを呼び出す方法は?

分類Dev

ルートファイルでクラスをインスタンス化すると、次のエラーが発生します。関数呼び出しはデコレータでサポートされていません

分類Dev

Webスクレイピングされた文字列をforループの外部で呼び出すことはできません

分類Dev

親インターフェースのデフォルトメソッドを、そのインターフェースをサブクラス化するインターフェースから呼び出すことができますか?

分類Dev

Linuxターミナルから呼び出されたメインクラスを検索またはロードできませんでした

分類Dev

電子メールを送信するためにタスク関数を呼び出すときに、オブジェクト参照がオブジェクトのインスタンスに設定されていません

分類Dev

スーパークラスのオーバーライドされたセッタープロパティを呼び出すことができません

分類Dev

ローカルでインスタンス化されたクラスのメソッドとしてのスロットが呼び出されることはありません

分類Dev

BabelでトランスパイルされたGraphQLがエラー「クラスを関数として呼び出すことができません」をスローする

分類Dev

インクルード後にインスタンスメソッドをモジュールメソッドとして呼び出すことができるのはなぜですか?

分類Dev

Retrofit 2.0 + GSONインターフェースの引数なしコンストラクターを呼び出すことができません

分類Dev

Android + Retrofit 2 + GSON =インターフェースの引数なしコンストラクターを呼び出すことができません

分類Dev

オーバーライドされたメソッドを呼び出すスーパークラス参照がポリモーフィックに見えるのはなぜですか、それがオーバーライドされたメンバー変数を取る場合はそうではありませんか?

分類Dev

付属のモジュールのようにインスタンスメソッドを直接呼び出すことはできますか?

分類Dev

付加されたモジュールでインスタンス変数を使用できません

Related 関連記事

  1. 1

    クラスのインスタンス変数を呼び出すことができませんか?

  2. 2

    Pythonでは、スクリプトによってインポートされたモジュール内からスクリプトの関数をどのように呼び出すことができますか?

  3. 3

    AngularJs:子モジュールのディレクティブでリンクされた関数を呼び出すことができませんか?

  4. 4

    別のモジュールで設定されたクラスインスタンス変数にアクセスできません

  5. 5

    puppetはインストールされたモジュールapacheからクラスを見つけることができません

  6. 6

    親クラスの関数がclassmethodまたはインスタンスメソッドによって子クラスから呼び出されていることをどのように知ることができますか?

  7. 7

    スーパータイプコンストラクターが呼び出される前は "X"を参照できません。xは最終変数です

  8. 8

    Java:スーパータイプコンストラクターが呼び出される前に高さを参照することはできません

  9. 9

    アンドロイドエミュレーターを回転させて向きをランドスケープモードまたはポトレイトモードに変更すると、「OnSizeAllocated」が呼び出されません

  10. 10

    python-スクリプトでは関数を呼び出すことはできませんが、インタラクティブモードでは呼び出すことができます

  11. 11

    django-rest-framework:シリアライザーインスタンスのインスタンス化時に `data =`キーワード引数が渡されなかったため、 `.is_valid()`を呼び出すことができません

  12. 12

    MVCパターン、モデルクラスは、配列の作成に使用されるイニシエーターの1つを呼び出すことができません

  13. 13

    シリアライザインスタンスのインスタンス化時に `data =`キーワード引数が渡されなかったため、 `.is_valid()`を呼び出すことができません

  14. 14

    そのクラスのオブジェクトが作成されたときにコンストラクターがメモリを取得する外部で関数がクリアされていますか。関数が呼び出されていません

  15. 15

    オブジェクトがインスタンス化されたときに親コンストラクターを呼び出す方法は?

  16. 16

    ルートファイルでクラスをインスタンス化すると、次のエラーが発生します。関数呼び出しはデコレータでサポートされていません

  17. 17

    Webスクレイピングされた文字列をforループの外部で呼び出すことはできません

  18. 18

    親インターフェースのデフォルトメソッドを、そのインターフェースをサブクラス化するインターフェースから呼び出すことができますか?

  19. 19

    Linuxターミナルから呼び出されたメインクラスを検索またはロードできませんでした

  20. 20

    電子メールを送信するためにタスク関数を呼び出すときに、オブジェクト参照がオブジェクトのインスタンスに設定されていません

  21. 21

    スーパークラスのオーバーライドされたセッタープロパティを呼び出すことができません

  22. 22

    ローカルでインスタンス化されたクラスのメソッドとしてのスロットが呼び出されることはありません

  23. 23

    BabelでトランスパイルされたGraphQLがエラー「クラスを関数として呼び出すことができません」をスローする

  24. 24

    インクルード後にインスタンスメソッドをモジュールメソッドとして呼び出すことができるのはなぜですか?

  25. 25

    Retrofit 2.0 + GSONインターフェースの引数なしコンストラクターを呼び出すことができません

  26. 26

    Android + Retrofit 2 + GSON =インターフェースの引数なしコンストラクターを呼び出すことができません

  27. 27

    オーバーライドされたメソッドを呼び出すスーパークラス参照がポリモーフィックに見えるのはなぜですか、それがオーバーライドされたメンバー変数を取る場合はそうではありませんか?

  28. 28

    付属のモジュールのようにインスタンスメソッドを直接呼び出すことはできますか?

  29. 29

    付加されたモジュールでインスタンス変数を使用できません

ホットタグ

アーカイブ