如下代碼在Ruby中的含義是什麼? html
||=
它的語法是否有任何意義或緣由? ruby
a ||= b
是條件賦值運算符 。 這意味着若是a
未定義或falsey ,而後評估b
,並設置a
對的結果 。 一樣地,若是a
被定義而且評估爲真實,則不評估b
,而且不進行任何分配。 例如: session
a ||= nil # => nil a ||= 0 # => 0 a ||= 2 # => 0 foo = false # => false foo ||= true # => true foo ||= false # => true
使人困惑的是,它看起來與其餘賦值運算符(例如+=
)相似,但表現不一樣。 ide
a += b
轉換爲a = a + b
a ||= b
粗略轉換爲a || a = b
a || a = b
它是a || a = b
的近似簡寫 a || a = b
。 不一樣之處在於,當a
未定義時, a || a = b
a || a = b
會提升NameError
,而a ||= b
設置a
到b
。 若是a
和b
都是局部變量,那麼這種區別並不重要,但若是它們是類的getter / setter方法則很重要。 spa
進一步閱讀: code
x ||= y
是 htm
x || x = y
「若是x爲false或未定義,則x指向y」 ip
a ||= b
至關於 get
a || a = b
並非 pip
a = a || b
由於您使用默認值定義哈希的狀況(哈希將返回任何未定義鍵的默認值)
a = Hash.new(true) #Which is: {}
若是您使用:
a[10] ||= 10 #same as a[10] || a[10] = 10
a仍然是:
{}
可是當你這樣寫的時候:
a[10] = a[10] || 10
變爲:
{10 => true}
由於你已經在鍵10
分配了本身的值,默認爲true,因此如今爲鍵10
定義了哈希,而不是從不首先執行賦值。
假設a = 2
且b = 3
那麼, a ||= b
將致使a
的值,即2
。
做爲當計算結果爲某個值沒有致使以false
或nil
..這就是爲何它ll
不計算b
的值。
如今假設a = nil
且b = 3
。
那麼a ||= b
將獲得3
即b
的值。
由於它首先嚐試評估一個致使nil
的值...因此它評估了b
的值。
ror應用程序中使用的最佳示例是:
#To get currently logged in iser def current_user @current_user ||= User.find_by_id(session[:user_id]) end # Make current_user available in templates as a helper helper_method :current_user
其中,當且僅當@current_user
未在以前初始化時,纔會觸發User.find_by_id(session[:user_id])
。
a ||= b
評估方式與如下每行相同
a || a = b a ? a : a = b if a then a else a = b end
-
另外一方面,
a = a || b
評估方式與如下每行相同
a = a ? a : b if a then a = a else a = b end
-
編輯:正如AJedi32在評論中指出的那樣,這隻適用於:1。a是一個已定義的變量。 2.評估一次和兩次不會致使程序或系統狀態的差別。