module 和 class 和 def (作用域门)

6 篇文章 0 订阅

作用域门:
在ruby中有三个门,Module门, Class门, def门,这里的门就是作用域的门。
看下面代码:

a1 = 1
class A                        //作用域门:进入Class门
    a2 = 2
    p local_variables
    def hello                  //作用域门:进入def门
        a3 = 3
        p local_variables
    end                        //作用域门:离开def
end                            //作用域门:离开Class

a = A.new
a.hello
p local_variables

结果:

[:a2]
[:a3]
[:a1, :a]

从上面我们看到了两个门一个是Class一个是def,这里我相应打出了各个作用域的局部变量,程序运行完回到了外部作用域,其实就是顶层作用域

那这里我就有个问题提问了,那如果在class和def中访问到外部的a1变量???

其实是可以办到的,我们分析下,为什么a1会访问不到,原因就是class门和def门挡住了,就像生活中我把门关上了你能进来吗??当然不会。

那如果我们把门去掉是不是就可以了,ruby是可以的,看如下代码:

a1 = 1
A = Class.new do
    a2 = 2
    p local_variables
    define_method(:hello) do
        a3 = 3
        p local_variables
    end
end

a = A.new
a.hello
p local_variables

输出结果:

[:a2, :a1, :a]
[:a3, :a2, :a1, :a]
[:a1, :a]

从结果来看其实不管是class里面还是def里面都有 a1变量了,说明都已经拿到了,其实我这里的做法就是去掉门,完成了上面的要求,
这里还用到了代码块,其实就是闭包,最后输出的时候并没有a2,a3,闭包是会打开和关闭,关闭的一瞬间,外部就访问不到,当然你可以修改闭包里面的变量值来达到修改外部变量的值,这里的module就不说了跟class类似。

总结:

module: 通过Module.new可以干掉module门 class: 通过Module.new可以干掉class门 def:
通过Module.new可以干掉def门 上面可以理解为扁平化作用域,压着压着就没了,也可以理解为共享作用域

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 pytest 中,fixture 的作用域可以通过 `@pytest.fixture(scope=...)` 来指定。以下是几种不同的作用域: - `function`:每个测试函数运行一次,即每个测试函数都会调用一次 fixture。 - `class`:每个测试类运行一次,即每个测试类中的所有测试函数都会共享同一个 fixture 实例。 - `module`:每个测试模块运行一次,即每个测试文件中的所有测试函数都会共享同一个 fixture 实例。 - `session`:整个测试会话只运行一次,即所有测试文件中的所有测试函数都会共享同一个 fixture 实例。 默认情况下,fixture 的作用域为 `function`,即每个测试函数都会调用一次 fixture。如果需要在多个测试函数中共享 fixture 的状态,可以将作用域设置为 `class`、`module` 或 `session`。 在使用 fixture 的过程中,可以通过 fixture 函数的返回值来传递变量。如果需要在不同的作用域中共享变量,可以使用 fixture 函数的缓存机制。例如: ```python import pytest @pytest.fixture(scope="session") def some_data(): data = {"key": "value"} return data def test_func1(some_data): assert some_data["key"] == "value" def test_func2(some_data): assert some_data["key"] == "value" ``` 在上面的例子中,`some_data` 是一个作用域为 `session` 的 fixture,它返回一个字典。在 `test_func1` 和 `test_func2` 中,都需要使用这个字典。由于 `some_data` 的作用域为 `session`,因此它只会在整个测试会话中被调用一次。在 `test_func1` 和 `test_func2` 中,都会传入相同的 `some_data` 参数,这样就可以在不同的测试函数之间共享变量了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值