2014-08-29 46 views
-5

我是Ruby的新手。什麼是印刷品,爲什麼?向我解釋這個簡單的紅寶石代碼

a = nil 
b = 2 
a ||= b 
puts a 

向我解釋這個簡單的代碼。

+0

a || = b是a = a ||的簡短手段b因爲a是零(和falsy)b會打印出來2,只需打開irb並自己嘗試。 – Doon 2014-08-29 12:40:58

+0

這不是一個真正的Ruby問題,它是適用於所有語言的基本編程邏輯。一本好的編程教科書將會覆蓋它。 – 2014-08-29 16:12:32

回答

1

很多編程需要理解布爾邏輯,基本上如何確定真值和假值,這是觸發條件邏輯的原因分支,循環等

考慮一下:

Ruby中有真假值,其中有truefalse相當於保留字(實際上遠不止這一點,但認爲更深層次的是對不同的時間。 ):

true # => true 
false # => false 

只有nilfalse是Ruby的假值,其他一切都是true。這不同於其他一些語言,如Perl,它認爲0''(空字符串)也是錯誤的。請記住,Ruby中只有nilfalse是錯誤的。

的 「非」 值的truefalse(AKA,對立)分別falsetrue。該!(布爾「NOT」)運算符用於此:

!true # => false 
!false # => true 

現在,這是一招,你會看到高級程序員使用:NOT-ING他們兩次返回其原始值的布爾版本:

!!true # => true 
!!false # => false 

這是一個重要的事情要了解。我們可以用值!!除了true/false並確定它們是否是真的還是假的值:

!!'' # => true # !> string literal in condition 
!!0 # => true # !> literal in condition 
!!'foo' # => true # !> string literal in condition 
!!1 # => true # !> literal in condition 

Ruby是不是太高興,我使用一個字面的測試,但你可以看到,上文全部爲真,這些都是假的:

!!false # => false 
!!nil # => false 

希望你看到我們如何看待值的語言兩種方式,無論他們是真/假和其實際價值是什麼。

繼續前進:

||(布爾 「OR」)着眼於左側的價值第一。如果它是真的,它會返回該值。如果是假的,它看起來在右側,並返回:

true || false # => true 
false || true # => true 

nil || 'foo' # => "foo" 
false || 2 # => 2 

||=運營商的行爲類似,只有比較之後,它分配到左邊的變量,如果它是一個假的類型值:

a = false 
a ||= true 
a # => true 

a = true 
a ||= false 
a # => true 

分配給變量,而不是直接對文字測試,結果類似的結果:

a = nil # => nil 
!a # => true 
!!a # => false 

b = 2 # => 2 
!b # => false 
!!b # => true 

多一點:

||=用作速記取代的一點點if/then代碼:

a = nil # => nil 
b = 2 # => 2 
if !a 
    a = b 
end 
a # => 2 

a = 1 # => 1 
b = 2 # => 2 
if !a 
    a = b 
end 
a # => 1 

而且所有通向該代碼你想明白:

a = nil # => nil 
b = 2 # => 2 
a ||= b # => 2 
+0

哇,很好的回答! – Mischa 2014-08-31 15:57:04

2

2被打印出來,因爲||=在左側變量爲nilfalse時將右側值賦給左側變量。 anil,所以2將被分配到a。因此打印2

0

我相信||=是說的簡寫方式, 「如果a是假的把它分配給......」 在這種情況下b

所以

a = nil 
b = 2 
a ||= b 
puts a 
    > 2 

a = 4 
b = 2 
a ||= b 
puts a 
    > 4 
+0

這並不是說「如果a是零」,它是說「如果a是假的」。在Ruby中,零和「假」是錯誤的值,其他的都是「真」。 – 2014-08-29 15:36:05

+0

@TheTinMan:感謝您的更正!完全正確。我已經更新了我的回答 – 2014-09-01 09:45:19