2014-01-21 63 views
1

我的印象中,我可以使用紅寶石:區別&=和&& =

bool &= true 
# and 
bool &&= true 
# indifferently 

有沒有兩者之間有什麼區別?不推薦一個解決方案嗎?

其實

bool = true & false # false 

那麼,什麼是一般&&&之間的區別? (我想這同樣適用於||

+2

我不知道Ruby,但我想'&='按位與'&& ='邏輯和 –

+2

http://en.wikipedia.org/wiki/Bitwise_operation – emaillenin

+0

http://stackoverflow.com/questions/4115045/ruby-what-does-the-snippet-num-1-0-exactly-do – doctorlove

回答

3

嘗試以下操作:

x = 5 
x |= 2 
=> 7 

| =和& =等同於按位X = X | 2和X = X 2 &

VS

x = 5 
x ||= 2 
=> 5 

在第二個語句,x ||= 2,它意味着x = 2如果x是零,否則是X。 (x = (x || 2);表達x || 2返回x,如果x是什麼,但零否則返回2.

x ||= 'foo'實際上是很常見的紅寶石(組x爲foo爲或X爲尚未設置)

x = (x & 3)(其相當於x &= 3),返回3(第二個操作數),除非x爲0,則返回0) )

同樣的邏輯也適用於&,但它更容易找到我心中的頂部爲例|

=)

2

的關鍵字之間的主要區別在於,第一|是一種方法,並且可以重新定義爲一個類,並且所述第二||不大,並且可以從未定義爲方法,並只是用於語言的語法,你可以下面的例子中看到:

Array.new.respond_to?(:|) 
# => true 
Array.new.respond_to?(:||) 
SyntaxError: (irb):35: syntax error, unexpected tOP_ASGN, expecting tSTRING_CONTENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END 

所以,當你應用了#|方法就能夠返回,從true,或false不同的值。雖然紅寶石TrueClass,和FalseClass這些值是truefalse,但其他的後代可以重新定義的返回值,但是,對於ArraySet類它實現類似於布爾按位操作功能。所以可以肯定的是,truefalse類的方法也返回truefalse。否則,該關鍵字||是真正的語言布爾運算符,但它與價值真正工作不是真,你可以看到它例如:

'value1' || 'value2' 
# => "value1" 
true || false 
# => true 
'value1' || false 
# => "value1" 
false || 'value2' 
# => "value2" 

返回衣被合計總是服從於邏輯表達式,但它的值是,如我上面所示,,和不是真。因此,你在例如返回值不僅true/false雙,但真正的變量值的看到過了,你可以按如下方式使用它作爲if條件運算符:

'value1' || 'value2' 

if 'value1' 
    'value1' 
else 
    'value2' 
end 

將返回相同的價值。

根據或相等分配我們看到下列情況:

A |= false 
# NameError: uninitialized constant A 
a |= false 
# false 
A ||= false 
# => false 

在我們能夠|=操作分成兩個第一種情況:來電#|方法,以及將結果提供給分配變量。在第二種情況下,ruby解釋器看到整個運算符||=,驗證它是否爲nilundefined,如果是,則將該表達式結果賦值給變量或const。

&,&&有相同的解釋。

+2

不投降,看到你花時間回答,但至少methinks * *提及'&'和'|'通常是按位運算符,並且它們用於其他事物(實際上,它們非常類似於按位和/或),如'Array'和'Set '。 –

+0

:||給你非法的語法錯誤。你應該引用符號:'||'。 – Yossi

+0

@Yossi the':<<'不要發出同樣的問題。你不能將一個方法定義爲'def ||'。 –

0

當你只在布爾值上使用&運算符時,與&&沒有什麼區別,但是如果你想在返回布爾值的函數中使用它,那麼就會有差異。看看下面的代碼:

def side_effect(message="hello") 
    puts message 
    true 
end 

#writes "hello" 2 times to the console and then returns false 
false & side_effect & side_effect 

# just returns false without writing "hello" to the console. 
false && side_effect && side_effect