我正在跟隨Rails 3 in Action書,它正在討論在模型中覆蓋to_s
。代碼如下:有人可以向我解釋下面的代碼嗎?
def to_s
"#{email} (#{admin? ? "Admin" : "User"})"
end
我知道,在Ruby中,你可以通過"#{value}"
顯示雙引號內的值,但什麼是了雙問號?
我正在跟隨Rails 3 in Action書,它正在討論在模型中覆蓋to_s
。代碼如下:有人可以向我解釋下面的代碼嗎?
def to_s
"#{email} (#{admin? ? "Admin" : "User"})"
end
我知道,在Ruby中,你可以通過"#{value}"
顯示雙引號內的值,但什麼是了雙問號?
這是string interpolation。 "#{email} (#{admin? ? "Admin" : "User"})"
相當於
email.to_s + " (" + (admin? ? "Admin" : "User") + ")"
即
email.to_s + " (" + if admin? then "Admin" else "User" end + ")"
由於被封閉在引號中,在這種情況下Admin
和User
被用作字符串和不爲常數的結果。
此功能與電子郵件返回一個字符串,他們是否是管理員或用戶... 即
user_1 = {:email => "[email protected]", :admin => true}
因此呼叫
user_1.to_s
將返回字符串
"[email protected] Admin"
第一個問號是rails中的屬性查詢方法。 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Attribute+query+methods
(提供您未覆蓋/重新定義方法)
它是一種速記方法,看看是否能屬性存在或不存在。
其他admin?是,返回布爾函數(可能是在控制器/輔助方法或模型的某處定義的)(真或假)和下一個問號就像一個如果條件
if admin? == true
"Admin"
else
"User"
之前第一部分「:」爲真情況和其他是爲了假的情況
不要把它看作雙重問號,第一個問號是方法名稱的一部分(Ruby允許方法名以「!」,「?」,「=」結尾,「[]」等)。由於管理員是一個布爾值ActiveRecord添加管理員?如果用戶是管理員,則返回true;否則返回false。
另一個問號是用來與冒號(:),你可以看到它像:
condition ? statement_1 : statement_2
如果條件爲真時執行的第一條語句,否則第二個它evalueted。
因此,將這兩個東西放在一起,並且您有一個字符串連接,在括號之間添加「Admin」或「User」字。
'病情? true_result:false_result'語法被稱爲[三運算符](http://en.wikipedia.org/wiki/Ternary_operation)btw。你可以找到它的大多數語言作爲'if ... then ... else'的簡寫形式。 – 2012-03-26 08:30:24
謝謝!在繼續之前,字符串插值絕對是我要閱讀的更多內容。聽起來我應該更熟悉它。 – ruevaughn 2012-03-26 20:48:54