在Ruby中,|| =(or-equals)是什麼意思?

如下代碼在Ruby中的含義是什麼? html

||=

它的語法是否有任何意義或緣由? ruby


#1樓

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設置ab 。 若是ab都是局部變量,那麼這種區別並不重要,但若是它們是類的getter / setter方法則很重要。 spa

進一步閱讀: code


#2樓

x ||= y

htm

x || x = y

「若是x爲false或未定義,則x指向y」 ip


#3樓

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定義了哈希,而不是從不首先執行賦值。


#4樓

假設a = 2b = 3

那麼, a ||= b將致使a的值,即2

做爲當計算結果爲某個值沒有致使以falsenil ..這就是爲何它ll不計算b的值。

如今假設a = nilb = 3

那麼a ||= b將獲得3b的值。

由於它首先嚐試評估一個致使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])


#5樓

簡潔而完整的答案

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.評估一次和兩次不會致使程序或系統狀態的差別。

相關文章
相關標籤/搜索