2013-08-23 39 views
0

我正在學習Michael Hartl的Tutorial中的Rails,我對符號如何工作以及如何使用它有點困惑。如何在Ruby中使用符號

這裏是註冊頁面的測試代碼片段:

describe "signup" do 

    before { visit signup_path } 

    let(:submit) { "Create my account" } 

    describe "with invalid information" do 
     it "should not create a user" do 
     expect { click_button submit }.not_to change(User, :count) 
     end 
    end 

我的問題是,如果不是這種click_button :submit用冒號(:)?

我知道符號像不可變的字符串,不能被賦值如:submit = "Create my account"。但那麼let()方法究竟做了什麼?

我有一個Java背景,我有點與符號概念混淆。

回答

3

您遇到問題rspec,而不是符號。用Java術語來說,符號介於final Stringenum之間,我相信你的理解是合適的。這是這裏的一個關鍵問題:

但是那麼let()方法到底做了什麼?

let是一個rspec方法,該方法定義了要爲每個示例設置的變量。所以,基本上,

let(:submit) { "Create my account" } 

(其中:submit是一個符號)每個it塊之前指示rspec做這樣的事情

submit = "Create my account" 

(其中submit是一個變量)。

(這是一種簡化。通過let此處定義submit實際上不變量,但是方法名,它返回在每個例子中let設置在其第一次調用所述塊的評價,並在每個高速緩存的值然後你可以把它看作是隻讀變量,在某種意義上,let :submit { ... }的作用與attr :submit的作用類似:它們都動態地在當前的上下文中插入方法)

瞭解更多關於lethere

+0

感謝您的解釋。這真的有幫助。我明白了Let方法爲什麼需要這個符號。我不確定爲什麼有人會對這個答案投下贊成票。我會稍微接受這一點。 –

0

除了幾個硬連線結構等module Fooclass Foodef fooalias foodefined?{foo},也沒有辦法來指代一個未定義的方法/可變/恆定逐字內。

let等情況下,使用符號或字符串代替。 let本身並沒有對:submit做任何事情。它定義了一個名爲submit的方法,並且方法submit的拼寫由符號:submit給出。如果方法let被設計爲採用像"submit"這樣的字符串,那麼這同樣適用。

相關問題