gpt4 book ai didi

ruby - 为什么使用扩展/包含而不是简单地在主对象中定义方法?

转载 作者:太空宇宙 更新时间:2023-11-03 17:56:17 25 4
gpt4 key购买 nike

RSpec 添加了一个“描述”方法来处理顶级命名空间。然而,他们不是简单地在任何类/模块之外定义方法,而是这样做:

# code from rspec-core/lib/rspec/core/dsl.rb 
module RSpec
module Core
# Adds the `describe` method to the top-level namespace.
module DSL
def describe(*args, &example_group_block)
RSpec::Core::ExampleGroup.describe(*args, &example_group_block).register
end
end
end
end

extend RSpec::Core::DSL
Module.send(:include, RSpec::Core::DSL)

与简单地在任何模块和类之外定义 describe 相比,使用这种技术有什么好处? (据我所知,DSL 模块没有在 rspec-core 的其他任何地方使用。)

最佳答案

我做了这个更改 a few months ago这样 describe 就不再被添加到系统中的每个对象中。如果您在顶层定义它:

def describe(*args)
end

...那么系统中的每个对象都会有一个私有(private)的describe方法。 RSpec 不拥有系统中的每个对象,不应该随意向每个对象添加 describe。我们只希望 describe 方法在两个范围内可用:

describe MyClass do
end

(在顶层,离开主要对象)

module MyModule
describe MyClass do
end
end

(脱离任何模块,因此您将描述嵌套在模块范围内)

将它放在一个模块中可以很容易地扩展到主对象(只将它添加到该对象,而不是每个对象)并将它包含在 Module 中(将它添加到所有模块).

关于ruby - 为什么使用扩展/包含而不是简单地在主对象中定义方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12826270/

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