簡體   English   中英

如何理解 Ruby 中的 nil vs. empty vs. blank

[英]How to understand nil vs. empty vs. blank in Ruby

我發現自己反復尋找nil?差異的明確定義nil? blank? ,和empty? 在 Ruby on Rails 中。 這是我最近的一次:

  • blank? 對象為假、空或空白字符串。 例如, """ "nil[]{}為空。

  • nil? 對象是 NilClass 的實例。

  • empty? 對象是特定於類的,並且定義因類而異。 如果字符串沒有字符,則字符串為空;如果數組不包含任何項,則數組為空。

有什么遺漏,或者可以進行更嚴格的比較嗎?

.nil? 可以在任何對象上使用,如果對象為零則為真。

.empty? 可用於字符串、數組和散列,並在以下情況下返回 true:

  • 字符串長度 == 0
  • 數組長度 == 0
  • 哈希長度 == 0

運行.empty? 對 nil 的東西會拋出NoMethodError

那是哪里.blank? 進來了。它是由 Rails 實現的,可以對任何對象進行操作,也可以像.empty?一樣工作.empty? 在字符串、數組和散列上。

nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false

.blank? 還對非空但僅包含空格的字符串計算 true:

"  ".blank? == true
"  ".empty? == false

Rails 還提供.present? , 返回.blank?的否定.blank? .

數組陷阱: blank? 即使數組的所有元素都為空,也會返回false 在這種情況下,要確定空白,請使用all? blank? , 例如:

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 

我在所有情況下制作了這張有用的表格:

在此處輸入圖片說明

blank? present? 由 Rails 提供。

只需擴展朱利安的表:

在此處輸入圖片說明

Ref: empty?blank?nil?傻傻分

快速提示: !obj.blank? == obj.present? !obj.blank? == obj.present?

在某些表情中可以方便/更容易地看到眼睛

在此處輸入圖片說明

  • 一切都是nil? blank?
  • 一切都是empty? blank?
  • 沒有什么是empty? nil?
  • 沒有什么是nil? empty?

tl;dr——只使用blank? present? 除非你想區分""" "

一個區別是.nil? 和. .empty? 是由編程語言 Ruby 提供的方法,而.blank? 是 Web 開發框架 Rails添加的東西。

一個特殊情況是在嘗試評估布爾值是否為 nil 時:

false.present? == false
false.blank? == true
false.nil? == false

在這種情況下,建議使用.nil?

只是一點關於any?注意事項any? 建議:他是對的,它通常等同於!empty? . 然而, any? 將返回true為僅包含空格的字符串(ala " " )。

當然,也請參閱上面的 1.9 評論。

不要忘記any? 這通常是!empty? . 在 Rails 中,我通常檢查語句末尾是否存在某些內容, if somethingunless something然后使用blank? 哪里需要,因為它似乎無處不在。

nil? 是一個標准的 Ruby 方法,可以在所有對象上調用,如果對象為nil則返回true

b = nil
b.nil? # => true

empty? 是一個標准的 Ruby 方法,可以在一些對象上調用,例如字符串、數組和哈希,如果這些對象不包含元素,則返回true

a = []
a.empty? # => true

b = ["2","4"]
b.empty? # => false

empty? 不能在nil對象上調用。

blank? 是一個 Rails 方法,可以在nil對象和空對象上調用。

其他人都很好地解釋了有什么區別。

我想在 Ruby On Rails 中添加,使用obj.blank?更好obj.blank? obj.present? 而不是obj.nil? obj.empty? .

obj.blank? 手柄所有類型nil''[] {}並返回true ,如果值不可用,並返回false如果值可用在任何類型的對象。

exists? 方法可用於檢查數據是否存在於數據庫中。 它返回布爾值truefalse

導軌 4

@corban-brook 'Array gotcha : blank?'的替代方案用於檢查數組是否僅包含空值並且可以視為空白? 真的:

[ nil, '' ].all? &:blank? == true

還可以這樣做:

[nil, '', "", " ",' '].reject(&:blank?).blank? == true

nil? 可用於任何對象。 它確定對象是否具有任何值,包括“空白”值。

例如:

example = nil
example.nil?  # true

"".nil?  # false

基本nil? 只有當對象實際上等於“nil”時才會返回 true。

empty? 僅在被視為集合的對象上調用。 這包括字符串(字符的集合)、散列(鍵/值對的集合)和數組(任意對象的集合)之類的東西。 empty? 如果集合中沒有項目,則返回 true。

例如:

"".empty? # true
"hi".empty?   # false
{}.empty?  # true
{"" => ""}.empty?   # false
[].empty?   # true
[nil].empty?  # false

nil.empty?  # NoMethodError: undefined method `empty?' for nil:NilClass

注意到empty? 不能在 nil 對象上調用,因為 nil 對象不是集合,它會引發異常。

另請注意,即使集合中的項目為空,也不意味着集合為空。

blank? 基本上是nil?的組合nil? empty? 這對於檢查您認為是集合但也可能為零的對象很有用。

雖然這個問題有 n 種答案,但我喜歡這里解釋的方式,所以又發布了一個答案:-)

看看下面的指標- 它的自我解釋與跨可用方法使用的各種數據類型。

理解功能的度量方式

參考: https : //blog.appsignal.com/2018/09/11/differences-between-nil-empty-blank-and-present.html

暫無
暫無

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

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