[英]What does !! mean in ruby?
只是想知道什么!!
在 Ruby 中。
不是這樣的。 它用於將值轉換為布爾值:
!!nil #=> false
!!"abc" #=> true
!!false #=> false
但通常沒有必要使用,因為 Ruby 的唯一錯誤值是nil
和false
,因此通常最好讓該約定成立。
把它想象成
!(!some_val)
它合法使用的一件事是防止返回大量數據。 例如,您可能不想在您的has_image?
返回 3MB 的圖像數據has_image?
方法,或者您可能不想在logged_in?
返回整個用戶對象logged_in?
方法。 使用!!
將這些對象轉換為簡單的true
/ false
。
它返回true
,如果右邊的對象不是nil
,而不是false
, false
,如果它是nil
或false
def logged_in?
!!@current_user
end
!
意味着否定布爾狀態,兩個!
s 沒有什么特別的,除了雙重否定。
!true == false
# => true
它通常用於強制方法返回布爾值。 它將檢測任何類型的真實性,例如字符串、整數和其他類型,並將其轉換為布爾值。
!"wtf"
# => false
!!"wtf"
# => true
一個更真實的用例:
def title
"I return a string."
end
def title_exists?
!!title
end
當您想確保返回布爾值時,這很有用。 恕我直言,這有點毫無意義,但看到if 'some string'
和if true
是完全相同的流程,但有些人發現顯式返回布爾值很有用。
請注意,此習語也存在於其他編程語言中。 C 沒有固有的bool
類型,因此所有布爾值都被輸入為int
類型,規范值為0
或1
。 以這個例子為例(為了清楚起見添加了括號):
!(1234) == 0
!(0) == 1
!(!(1234)) == 1
“not-not”語法將任何非零整數轉換為1
,即規范的布爾真值。
不過,總的來說,我發現進行合理的比較比使用這個不常見的習語要好得多:
int x = 1234;
if (!!x); // wtf mate
if (x != 0); // obvious
如果您需要執行獨占或. 復制馬特范霍恩的答案,稍作修改:
1 ^ true
TypeError: can't convert true into Integer
!!1 ^ !!true
=> false
我用它來確保兩個變量要么都是 nil,要么都不是 nil。
raise "Inconsistency" if !!a ^ !!b
如果您需要將枚舉轉換為布爾值,了解它的工作原理會很有用。 我有使用classy_enum
gem 做到這一點的代碼:
class LinkStatus < ClassyEnum::Base
def !
return true
end
end
class LinkStatus::No < LinkStatus
end
class LinkStatus::Claimed < LinkStatus
def !
return false
end
end
class LinkStatus::Confirmed < LinkStatus
def !
return false
end
end
class LinkStatus::Denied < LinkStatus
end
然后在我的服務代碼中,例如:
raise Application::Error unless !!object.link_status # => raises exception for "No" and "Denied" states.
實際上,bangbang 運算符已成為我本來可以編寫為名為 to_bool 的方法的內容。
其他答案都討論了什么!!
是否以及它是否是好的做法。
但是,沒有一個答案給出將值轉換為布爾值的“標准 Ruby 方式”。
true & variable
TrueClass
是 Ruby 值true
的類,它實現了一個方法&
,其記錄如下:
如果
obj
為nil
或false
,則返回false
,否則返回true
。
當標准庫已經覆蓋時,為什么要使用骯臟的雙重否定?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.