assert_not_nil foo == assert 定义了吗? Ruby 的 Test::Unit 中的 foo?
Does assert_not_nil foo == assert defined? foo in Ruby's Test::Unit?
我是 Ruby/Rails 测试的新手。似乎 Test::Unit 方法 assert_not_nil foo
是正确的,以防万一 foo
被定义(即,它不是 nil
)。对吧?
那么 assert_not_nil foo
是否等同于 assert defined? foo
?
如果不是,它们有何不同?如果是这样,我有什么理由更喜欢其中之一吗?
也许更一般地说,似乎 assert
可以与其他表达式组合,以代替更专门的断言方法,如 assert_equal
和 assert_not
等。但似乎专门的方法都是比较规范的做法。那正确吗?这是为什么?
nil
是一个值,所以定义了一个值为nil的变量。这里有一些 repl 输出来演示:
[1] pry(main)> a = nil
=> nil
[2] pry(main)> defined? a
=> "local-variable"
[3] pry(main)> defined? b
=> nil
您可能会感到困惑,因为访问未定义的实例变量也是 returns nil
,但这仍然不一样:
[4] pry(main)> defined? @b
=> nil
[5] pry(main)> @b = nil
=> nil
[6] pry(main)> defined? @b
=> "instance-variable"
全局变量 ($foo
) 在这方面像实例变量一样工作,但访问未初始化的 class 变量 (@@bar
) 会引发 NameError
.
最后一件事:局部变量是在 Ruby 中的解析时声明的,因此如果您的方法的任何分支设置了局部变量,则该局部变量将在任何位置定义(并初始化为 nil
)方法(或块)。
我是 Ruby/Rails 测试的新手。似乎 Test::Unit 方法 assert_not_nil foo
是正确的,以防万一 foo
被定义(即,它不是 nil
)。对吧?
那么 assert_not_nil foo
是否等同于 assert defined? foo
?
如果不是,它们有何不同?如果是这样,我有什么理由更喜欢其中之一吗?
也许更一般地说,似乎 assert
可以与其他表达式组合,以代替更专门的断言方法,如 assert_equal
和 assert_not
等。但似乎专门的方法都是比较规范的做法。那正确吗?这是为什么?
nil
是一个值,所以定义了一个值为nil的变量。这里有一些 repl 输出来演示:
[1] pry(main)> a = nil
=> nil
[2] pry(main)> defined? a
=> "local-variable"
[3] pry(main)> defined? b
=> nil
您可能会感到困惑,因为访问未定义的实例变量也是 returns nil
,但这仍然不一样:
[4] pry(main)> defined? @b
=> nil
[5] pry(main)> @b = nil
=> nil
[6] pry(main)> defined? @b
=> "instance-variable"
全局变量 ($foo
) 在这方面像实例变量一样工作,但访问未初始化的 class 变量 (@@bar
) 会引发 NameError
.
最后一件事:局部变量是在 Ruby 中的解析时声明的,因此如果您的方法的任何分支设置了局部变量,则该局部变量将在任何位置定义(并初始化为 nil
)方法(或块)。