Muh*_*ais 14
我总是喜欢让一个实例变量出于以下几个原因:
实例变量在被引用时就会存在,这意味着如果你在实例变量拼写中犯了任何错误,那么当新的实例变量初始化为nil时,它肯定会引发一些问题.但是,如果你拼错它,你会得到NameError.
此外,您将在块之前初始化实例变量,这意味着每次运行规范时都会执行块之前,即使该规范不使用您已初始化的那些实例变量.以下给出的例子;
before do
@user = Factory :user
@movie = Factory :movie
end
it "should have user" do
@user.should eq User.first
end
it "should have movie" do
@movie.should eq Movie.first
end
Run Code Online (Sandbox Code Playgroud)虽然所有的规格都运行良好但是没有@movie在第一个规范中使用而@user在第二个规范中没有使用.
你也可以使用let with bang"!" let!,let懒惰地评估,如果不调用它将永远不会被实例化,用于let定义memoized helper,同时let!在每次方法调用之前强制评估.
我赞成这个问题,但最后我自己回答了这个问题.
首先描述差异
的let使用方法时,直到在该测试中引用它不初始化变量-这使得它不同于@instance variables其从一开始初始化.
一般来说,没有很大的不确定性.使用@instance variables时,你要确保let对象初始化.但另一方面,这可以做同样的事情let!,因此没有明显的使用理由@instance variable.
总之,对我来说,没有明显的理由来使用@instance variable过let,但没有明显的理由使用@instance variables过let!
@instance variables加载需要更多时间,并且通过使用它们可能会导致代码中不必要的复杂性,这可以通过使用let或避免let!
您也可以看看这两个答案,也许它会为您提供更多信息: