gpt4 book ai didi

ruby-on-rails - 在 Ruby 中将自己作为父类中的调用类

转载 作者:数据小太阳 更新时间:2023-10-29 08:35:37 27 4
gpt4 key购买 nike

我的第一个类有常量。我想让它以某种方式作为动态值发挥作用。

class Post < ActiveRecord::Base
TEST = ["#{self.name}", "test1"]
end


class FakePost < Post
end

rails console 中,我尝试使用 FakePost 访问 TEST 常量,但它仍然将 self 显示为“Post”对象。有什么办法可以实现吗?

电流:

irb(main):004:0> FakePost::Test

=> ["Post", "test1"]

但是当我通过 Post 而不是 vi FakePost 访问 Constant 时,我想返回这个结果。

预期:

irb(main):004:0> FakePost::Test

=> ["FakePost", "test1"]

最佳答案

问题是代码 TEST = ["#{self.name}", "test1"] 只被解释一次,当 Post 类被实例化时.之后它将固定为 ["Post", "test1"]

我想不出有什么方法可以用常量来完成这项工作,但如果你用类方法替换它,它就可以正常工作:

class Post
def self.TEST
[self.name, "test1"]
end
end

class FakePost < Post
end

Post.TEST
#=> ["Post", "test1"]

FakePost.TEST
#=> ["FakePost", "test1"]

之所以可行,是因为类方法中的代码是在运行时(即调用方法时)解释的,而不是在解释类时解释的。两个案例的时间线如下:

使用 TEST 常量:

  1. Post 类逐行实例化和解释。
  2. self.name 被解释并返回 'Post',因为 self 当前是 Post 类。
  3. Post::TEST 不可撤销地设置为 ["Post", "test1"]
  4. FakePost类被实例化并继承自Post,包括已经实例化的TEST常量["Post", "test1"]
  5. FakePost::TEST == Post::TEST == ["Post", "test1"] #=> true

使用TEST类方法:

  1. Post 类逐行实例化和解释。
  2. 添加了后类方法 TEST(但尚未解释)。
  3. FakePost 类被实例化并继承PostTEST 类方法。仍然没有被解释。
  4. 当您运行Post.TESTFakePost.TEST 时,该方法将最终被解释。 self 现在将是 PostFakePost,具体取决于哪个类调用了 TEST 方法。

关于ruby-on-rails - 在 Ruby 中将自己作为父类中的调用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45373825/

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