在Ruby中解除引用字符串实例变量和符号之间的区别

时间:2013-11-19 09:56:19

标签: ruby-on-rails

我正在使用rspec文件中的 let 函数。我想使用 let 函数替换字符串实例变量的使用,就像我在下面用@astr一样。

describe "Static pages" do
  let (:str) { "Ruby on Rails Tutorial Sample App" }

 describe "Contact Page" do

it "should have title 'Contact'" do
    @astr = "Ruby on Rails Tutorial Sample App"
  visit '/static_pages/contact'
  expect(page).to have_title("#{@astr} | Contact")
end
end

...

哪个成为

it "should have title 'Contact'" do
  visit '/static_pages/contact'
  expect(page).to have_title("#{str} | Contact")
end

令我困惑的是为什么#{str} 有效且#{:str} 没有 - 取消引用符号 - 就像我们保留'@'一样对于#{@ astr} ,为什么约定不适用于符号中的冒号?

1 个答案:

答案 0 :(得分:1)

定义let(:str)...后,str成为一种方法。

因此,当你在测试中调用str时,你不是在调用一个变量,而是一个返回你定义的东西的方法。

在我看来,let对实例变量有三个好处。

  1. 更明确。

  2. 很懒。除非您调用它,否则该方法不会返回。但是变量总是被定义并存在于内存中。因此let效率更高。

  3. 我自己的感觉。 str作为方法,在我的编辑器中显示方法颜色,而实例变量显示另一个。在我的代码中,方法看起来更好,更清晰。