是它惯用红宝石加assert()方法的红宝石的核心课吗?
题
我扩大了我的红宝石理解的编码一个相当于肯特*贝克人来完成在红宝石。蟒蛇(其中肯特写中)有一个assert()方法中的语言是广泛使用。红宝石不。我认为它应该很容易添加这一点,但是核对地方放它?
顺便说一句, 我知道所存在的各种单元的框架,在红宝石 -这是一个练习学习的红宝石成语,而不是"得到的东西"。
解决方案
不,这不是最佳做法。在Ruby中断言()的最好类比就是提高
raise "This is wrong" unless expr
如果要提供更具体的异常处理,可以实现自己的异常
其他提示
我觉得它是完全有效使用声称在红宝石。但你提到的两个不同的东西:
- 来完成框架的使用
assert
方法可以检查你的测试的期望。他们的目的是要用在你的测试代码,不在应用程序的代码。 - 一些语言,如C、Java或蟒蛇,包括一个
assert
建造旨在使用的内部编码的程序、检查假设你做关于他们的完整性。这些检查是建立内的代码本身。他们不是试验时间的效用,但一个发展时之一。
我最近写的 solid_assert:一点红宝石图书馆实施的红宝石的断言实用 并且还 后在我的博客解释其动机..它让你写信表达形式:
assert some_string != "some value"
assert clients.empty?, "Isn't the clients list empty?"
invariant "Lists with different sizes?" do
one_variable = calculate_some_value
other_variable = calculate_some_other_value
one_variable > other_variable
end
他们可以停用所以 assert
和 invariant
获得评价为空洞的声明。这让你避免任意性问题的产生。但注意 务实的程序员 建议对禁他们。你应该只停用他们,如果他们真正影响到绩效。
有关答复说,地道的红宝石的方法是使用一个正常的 raise
发言,我认为它缺乏表达的.一个黄金规则的坚定编程是不使用的断言为正常例外处理。他们是两个完全不同的东西。如果你使用相同的语法为他们两个,我认为你的代码将更加模糊不清。当然你会失去能力的停用它们。
你可以相信,使用断言是一件好事,因为两个必读书喜欢经典 务实的程序,从熟练掌握 和 代码完成 奉献全部分给他们,并推荐他们的使用。还有一个不错的文章 编程的断言 这说明了非常好,什么是果断的编程和时使用(这是基于在爪哇,但概念适用于任何语言)。
将断言方法添加到内核模块的原因是什么?为什么不使用另一个名为 Assertions
的模块?
像这样:
module Assertions
def assert(param)
# do something with param
end
# define more assertions here
end
如果您真的需要断言无处不在,请执行以下操作:
class Object
include Assertions
end
免责声明:我没有测试代码,但原则上我会这样做。
这不是特别惯用,但我认为这是一个好主意。特别是如果这样做:
def assert(msg=nil)
if DEBUG
raise msg || "Assertion failed!" unless yield
end
end
如果您决定不使用DEBUG(或其他一些方便的开关,我过去使用过Kernel.do_assert)设置,那么没有任何影响。