2015-09-16 100 views
2

根據this棧的問題,「和」與「&&」運營商在軌

and is the same as && but with lower precedence

我理解這一點。我相信這個問題與上述問題不重複。

在我的控制器執行以下代碼時:

user = user_email.present? && User.find_by(email: user_email)

user變量保存active record objectUser模型。因此執行user.valid_password? user_password沒有發生錯誤,測試成功通過。

但是,當我試圖用and代替&&時,結果令人驚訝。

當我試着用下面的代碼:

user = user_email.present? and User.find_by(email: user_email)

user變量保存boolean價值,從而執行user.valid_password? user_password了以下錯誤:

undefined method `valid_password?' for true:TrueClass

任何人都可以請解釋爲什麼會這樣。

+1

發生這種情況是因爲'和'比賦值低。這同樣適用於Ruby中的'or'。正因爲如此,那些2比控制結構更像操作符,允許你執行'do_something()或失敗'等事情,但對於新的Ruby程序員經常會感到困惑。 – Borsunho

回答

7
user = user_email.present? and User.find_by(email: user_email) 

被解釋爲:

(user = user_email.present?) and User.find_by(email: user_email) 

present?返回truefalse,其被分配給user

+0

那麼,這意味着'User.find_by(email:user_email)'如果我們使用'和'運算符不會起作用嗎? – SujitS

+1

@SujitS它不會有任何作用,除非這條線是周圍結構的另一部分。 – sawa

+0

這是因爲,正如在開頭提到的那樣,「=」比「和」具有更高的優先級。 (user = user_email.present?)並且評估因此而停止,因爲=具有更高的優先級。 –

-2

你的用戶變量有TrueClass。 TrueClass沒有「valid_password?」方法。這就是爲什麼它發生在你的代碼。

> a = true 
> a.valid_passowrd? 
> undefined method `valid_password?' for true:TrueClass 

爲什麼它必須起作用?

+2

OP已經知道*「'用戶變量持有布爾值」*,問題是「爲什麼?」。 – Stefan

+0

Becouse類TrueClass沒有「valid_password?」方法 所以要解決這個問題我需要更多關於他的任務的信息 – Alexandr

+0

問題已經解決了。感謝你的關心。 – SujitS