たとえば、インスタンス変数を定義したクラスがあります。
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
渡されたブロックを呼び出していることがわかります。included
rb_funcall
とき、あなたはinclude
あなたのクラス定義の2行目に、あなたのモジュールは、それが提供するブロック呼び出してincluded
、あなたのモジュール定義では。そのブロックを実行しているときに、Ruby@api_environment_name
は定義されていないものを識別し、エラーをスローします。そのインスタンス変数の定義をモジュールの前に置くとinclude
、モジュールはそれを認識します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加