gpt4 book ai didi

ruby - 需要帮助来理解这段代码

转载 作者:太空宇宙 更新时间:2023-11-03 18:21:14 26 4
gpt4 key购买 nike

我正在查看某人的代码,发现他已经用这样的东西完成了类评估

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", “@每页”, “@ parent 名字”, “@registered_robot_engines”, “@default_robot_engine”, “@首要的关键”, “@quoted_primary_key”, "@locking_column", "@attribute_methods_generated", "@表名", "@quoted_table_name", "@arel_table", “@arel_engine”, “@关系”, “@列”, "@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

最佳答案

这是一段特别奇怪的代码。首先,self.class_eval 根本不是必需的。普通的 class_eval 就可以了。我猜程序员更多地使用其他语言而不是 Ruby。在 Ruby 中,只有在极少数情况下才使用显式 self 接收器,例如调用以 = 符号结尾的方法时,或者确保调用的方法是公共(public)方法时(当使用显式接收器调用时,私有(private)方法将失败。

其次,很难想象为什么程序员不使用标准的 getter 和 setter,如:

class << self
attr_accessor :default_robot_engine
end

# Here is the case when its legal to use explicit self receiver:
self.default_robot_engine = RobotEngine.new( some_block )

然后通过以下方式轻松访问它

default_robot_engine

我强烈怀疑原始程序员对 Ruby 基础知识的无知。尽管有时有人有理由在不定义访问器的情况下篡改实例变量,但最好不要通过 class_eval,而是通过使用 #instance_variable_get/set 方法来实现:

instance_variable_set :@default_robot_engine, RobotEngine.new( some_block )
instance_variable_get :@default_robot_engine

在我看来,类 eval 对于这种情况来说太重了。

关于ruby - 需要帮助来理解这段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18119046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com