2012-03-26 402 views
3

我正在跟隨Rails 3 in Action書,它正在討論在模型中覆蓋to_s。代碼如下:有人可以向我解釋下面的代碼嗎?

def to_s 
    "#{email} (#{admin? ? "Admin" : "User"})" 
end 

我知道,在Ruby中,你可以通過"#{value}"顯示雙引號內的值,但什麼是了雙問號?

回答

7

這是string interpolation"#{email} (#{admin? ? "Admin" : "User"})"相當於

email.to_s + " (" + (admin? ? "Admin" : "User") + ")" 

email.to_s + " (" + if admin? then "Admin" else "User" end + ")" 

由於被封閉在引號中,在這種情況下AdminUser被用作字符串和不爲常數的結果。

+0

'病情? true_result:false_result'語法被稱爲[三運算符](http://en.wikipedia.org/wiki/Ternary_operation)btw。你可以找到它的大多數語言作爲'if ... then ... else'的簡寫形式。 – 2012-03-26 08:30:24

+0

謝謝!在繼續之前,字符串插值絕對是我要閱讀的更多內容。聽起來我應該更熟悉它。 – ruevaughn 2012-03-26 20:48:54

1

此功能與電子郵件返回一個字符串,他們是否是管理員或用戶... 即

user_1 = {:email => "[email protected]", :admin => true} 

因此呼叫

user_1.to_s 

將返回字符串

"[email protected] Admin" 
2

其他admin?是,返回布爾函數(可能是在控制器/輔助方法或模型的某處定義的)(真或假)和下一個問號就像一個如果條件

if admin? == true 
"Admin" 
else 
"User" 

之前第一部分「:」爲真情況和其他是爲了假的情況

2

不要把它看作雙重問號,第一個問號是方法名稱的一部分(Ruby允許方法名以「!」,「?」,「=」結尾,「[]」等)。由於管理員是一個布爾值ActiveRecord添加管理員?如果用戶是管理員,則返回true;否則返回false。

另一個問號是用來與冒號(:),你可以看到它像:

condition ? statement_1 : statement_2 

如果條件爲真時執行的第一條語句,否則第二個它evalueted。

因此,將這兩個東西放在一起,並且您有一個字符串連接,在括號之間添加「Admin」或「User」字。

相關問題