簡體   English   中英

有什么用!! ruby 是什么意思?

[英]What does !! mean in ruby?

只是想知道什么!! 在 Ruby 中。

不是這樣的。 它用於將值轉換為布爾值:

!!nil   #=> false
!!"abc" #=> true
!!false #=> false

但通常沒有必要使用,因為 Ruby 的唯一錯誤值是nilfalse ,因此通常最好讓該約定成立。

把它想象成

!(!some_val)

它合法使用的一件事是防止返回大量數據。 例如,您可能不想在您的has_image?返回 3MB 的圖像數據has_image? 方法,或者您可能不想在logged_in?返回整個用戶對象logged_in? 方法。 使用!! 將這些對象轉換為簡單的true / false

它返回true ,如果右邊的對象不是nil ,而不是falsefalse ,如果它是nilfalse

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類型,規范值為01 以這個例子為例(為了清楚起見添加了括號):

!(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

這是“雙重否定”,但不鼓勵這種做法。 如果您正在使用rubocop ,您會看到它抱怨此類代碼違反Style/DoubleNegation

理由是

由於這既神秘又通常是多余的,應該避免[然后釋義:] 將!!something更改為!something.nil?

如果您需要將枚舉轉換為布爾值,了解它的工作原理會很有用。 我有使用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的類,它實現了一個方法& ,其記錄如下:

如果objnilfalse ,則返回false ,否則返回true

當標准庫已經覆蓋時,為什么要使用骯臟的雙重否定?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM