gpt4 book ai didi

ruby - 为什么不能在 Ruby 的方法中声明常量?

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

考虑以下内容,StubFoo 是 Foo 的 stub ,我希望将其 stub 以进行一些测试。

class Runner

def run
Foo = StubFoo
foo = Foo.new
# using Foo...
end

end

这会生成以下错误消息:Dynamic constant assignment

然而,在 RSpec 中,我可以执行以下操作,这是有效且完全合法的:

it "should be an example" do
Foo = StubFoo
foo = Foo.new
foo.to_s.should == "I am stubbed!"
end

关于这个的几个问题。

  • 为什么这适用于 RSpec 测试用例,但不适用于上述方法?
  • 据我所知,“它”只是 RSpec 中的一个方法,但我可以在“方法”中重新声明一个常量。

我在使用模拟框架之前这样做,纯粹是想知道模拟、 stub 等...在 Ruby 中有何不同。我听说动态语言更容易模拟/ stub ,并且 Internet 上有一些指南,其中按上述方式完成了简单的类重新分配。根据我的研究,在 Ruby 中,不可能在方法中声明常量,但我如上所述感到困惑。

编辑

是的,这开始变得更有意义了。我已经将 run 更新为现在使用 const_set。

  def run
old = Foo
self.class.const_set(:Foo, StubFoo)
foo = Foo.new
puts foo.to_s
self.class.const_set(:Foo, old)
foo = Foo.new
puts foo.to_s
end

然而,这会生成一个警告,这是模拟框架在 Ruby 中的工作原理吗?显然更加优雅且功能齐全,但他们只是简单地压制了这个警告吗?

最佳答案

您不能使用 Constant = value 在方法定义中重新分配常量。但是,您可以使用 const_set 重新分配它们。基本上它是为了阻止,但不是禁止动态常量重新分配。

至于为什么它与 it 一起工作:是的,it 是一种方法,但您不是在定义它,而是在调用它。重新分配发生在您作为参数传递给 it 的 block 内。

block 继承创建它们的上下文的类型。这意味着在 block 内部,self.class.name 将是您的测试类的名称。因此,当您在传递给 it 方法的 block 内定义一个常量时,实际上是在您的测试类上定义一个常量。

关于ruby - 为什么不能在 Ruby 的方法中声明常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3409931/

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