私は誰かのコードを調べていますが、彼がこのようなものでクラス評価を行っていることがわかりました
self.class_eval("@default_robot_engine = RobotEngine.new(some_block)")
その後、このようにアクセスされます
self.class_eval("@default_robot_engine")
このコードを理解するには助けが必要です。class_eval を実行するのではなく、@default_robot_engine にアクセスする他の方法はありますか?
Class.instance_variable_names を実行すると、
["@attribute_methods_mutex"、"@generated_attribute_methods"、"@generated_feature_methods"、"@observer_instances"、"@per_page"、"@parent_name"、"@registered_robot_engines"、"@default_robot_engine"、"@primary_key"、"@quoted_primary_key" 、「@locking_column」、「@attribute_methods_generated」、「@table_name」、「@quoted_table_name」、「@arel_table」、「@arel_engine」、「@relation」、「@columns」、「@column_names」、「@columns_hash」 、「@cached_attributes」、「@attribute_method_matchers_cache」、「@ generated_external_attribute_methods」]
ClassName.registered_robot_engine
を除いて、このようにすべてのインスタンス変数にアクセスできますdefault_robot_engine
。なぜ?
このインスタンス変数は動的なものであり、attr_readerが設定されていないため、答えがわかりました。アクセスする唯一の方法は、class_evalを介することだと思います