2013-04-13 13 views
1

在Ruby中,空字符串""與條件有關。我看到很多人都在爲這個事實而努力。 Ruby on Rails的blank?是解決這個問題的一個嘗試。另一方面,當這樣的規範變得方便時,這並不明顯。是否有任何用例說明這個事實變得方便,否則會有理論上的問題?如果一個空字符串真的有什麼好處?

+1

是否有任何使用情況下將''''視爲虛假變得方便?我認爲這更令人驚訝。 – meagar

+2

任何人都會考慮使用'blank?'將會是一個用例。有很多。 – sawa

+0

我認爲這個問題太寬泛,無法合理回答。你在問爲什麼做出語言設計決策。我可以爲您提供一個有效的用例,在這個用例中它變得非常方便,而且它不是那樣。 – Shoe

回答

7

我想我想出了答案。可能是出於理論上的原因和效率。在單個類的不同實例之間繪製線在理論上比在類之間繪製線更加複雜,並且需要更多計算。如果""是有缺陷的,那麼Ruby內部每次在條件中存在字符串時都必須檢查字符串的長度。相反,如果真正的情況可以由班級來判斷,情況恰恰如此,那麼它會更有效率。也許這也是爲什麼falsetrue不包含在單個類別Boolean下但分別屬於獨立類別的原因。

另一種可能性是,只有一個實例falsenil,因此在Ruby中內部處理只需要檢查指針/對象id,而字符串是可變的,並且需要更復雜的檢查空白。

4

減少考慮事項的數量falsey是件好事。它簡化了語言,簡化了布爾規則,使它們更易於記憶和應用,從而減少了錯誤。

試想一下,在混亂PHP是:false00.0'0'''nullarray()falsey之後,每天都保持驚人的許多人。

如果要測試空字符串,請測試空字符串。您應該知道您的變量是否包含字符串或布爾值,並且能夠相應地進行測試。

+0

你的觀點是,越好越有意義,但仍然聽起來有點虛弱。你能詳細說明在PHP中令人驚訝的是什麼? – sawa

+2

呃,特別是'0'(0作爲一個字符串)是相當有爭議的。它不是一個空*字符串,但它被認爲是'false'。這似乎相當武斷。那麼爲什麼不「'false」(字符串「false」)呢?因爲這是一個*非空字符串*。所以規則是*非空字符串,除了''0'是假*。對於newbs而言,這是一個很難解釋和保留的問題,而'false'和'nil'是'假'的時期。在PHP中,你必須真正考慮像*這樣的函數可能返回一個空數組,我真的希望這意味着'false'嗎?*或者*可能這裏的輸入是'「0,並且這應該是'false '?* – deceze

+0

但這裏的重點不是關於「false」或「0」。這是關於''「'的。 – sawa

2

我認爲Ruby被設計得很簡單,並且FEWER值爲false使得程序更易於推理:「只有兩個對象的布爾值爲false,這些是false對象本身和nil對象。」

這個折衷是你可能必須寫更.blank?。另一方面,有多少個字段的最小長度爲1?不多。如果你正在檢查.size > 1,那麼「空字符串真實」是沒有用的。

每種語言都選擇它是「範式」。例如,在SQL中,布爾操作實際上有3個值(true,false,null)。在Perl和C中,0是錯誤的。哎呀,在某些語言中,字符串「false」是錯誤的。

+0

你的答案太抽象了。如果越少越好,那麼爲什麼不僅有一個而是兩個虛假元素?爲什麼兩個人都可以,而不是三個? – sawa

相關問題