显然是在ruby类中编写的随机单词

显然是在ruby类中编写的随机单词,ruby,Ruby,我遇到了这样的事情: class OBRTestBase < Test::Unit::TestCase # some stuff here ... setup def obr_setup # more stuff here ... end # more stuff here ... 类OBRTestBase

我遇到了这样的事情:

class OBRTestBase < Test::Unit::TestCase

    # some stuff here ...

    setup
    def obr_setup
        # more stuff here ...
    end

    # more stuff here ...
类OBRTestBase 写入的
setup
行是什么?您能在类中编写任何单词吗?方法应该在类中,而不使用
def
@
?它完成了什么


我还找到了单词
teardown
。有什么可以写的吗?有保留字列表吗?

在Ruby代码中,您编写方法,然后按照读取顺序执行它们。如果在类
OBRTestBase
中编写
setup
(假设它是一个方法,因为如果它是局部变量,它将无效),它将在
OBRTestBase
的上下文中执行。如果没有此类方法或局部变量,则会引发错误。

在本上下文中,setup
是在加载类时可用的方法。它可以通过多种方法注入到当前上下文中

要查找此方法在项目中的定义位置,可以打印该方法的源位置:

p method(:setup).source_location

想象一下这段代码

def setup
  puts "managing external connections"
  puts "doing setup work and throwing needed exceptions"
  puts "we have successfully found the mothership"
end

def verify
    puts "class A has successfully been defined"
end
class A
    setup
    def initialize
        puts "initializing a new a"
    end
    def foo
        puts "foo"
    end
    verify
end

puts "-----start of program-----"
a = A.new()
a.foo
我们需要在启动应用程序时连接到外部资源。当这些资源不可用时,我们希望事先得到通知

运行这段代码将有以下输出

managing external connections
doing setup work and throwing needed exceptions
we have successfully found the mothership
class A has successfully been defined
-----start of program-----
initializing a new a
foo
=> nil
除此之外,它还用于在类中定义公共和私有方法时为它们启动新的作用域

Class A
  public
  public_foo(x)
    ...
  end

  private
  private_bar(x)
    ...
  end
end

注意,public_foo方法是在public类定义上定义的。而不是在类被初始化时。

是的,方法在被调用时被执行。编写它们时会调用它们。您正在调用@Dbugger方法,这就是
setup
所做的。当Ruby到达
setup
行时,
self
被设置为
OBRTestCase
-因此
setup
正在调用
OBRTestCase
类上的方法
setup
。这难道不等同于只使用“initialize”,这将有一个隐式调用吗?它可以被继承。要知道它从何处来,可以使用源位置。加载类时“可用”是什么意思?“可用”如
self
中定义的。当类正在加载
self
时,将显示正在加载的类。因此,类上已经定义了方法。它们不是保留关键字。它们可以是任何方法调用。如果你定义了一个类方法foo(),你可以用同样的方法调用它。它的意义是什么?这不是我们使用“initialize”的原因吗?区别在于这里的setup方法是在类定义时调用的,而initialize方法是在类实例化时调用的。为什么不在构造函数的开头和结尾添加setup和verify呢?假设构造函数需要一个写在磁盘文件中的值。每次用户想要调用一个方法时,我们都可以检查该文件的存在性,如果存在,则打开该文件。但是每次调用一个简单的方法时,都需要做大量的工作。因为我们知道每次调用此方法时都需要此文件(否则将失败)我们可以在程序加载时打开/创建此文件,而不是在调用运行时方法时打开/创建。此外,当您将它们添加到构造函数中时,每次创建新的a时,您都会调用这些方法。而在类定义中这样做时,您只会调用该方法1次。