2014-04-14 31 views
2

我對Ruby和編程都很陌生。雖然我的工作方式通過的「基礎紮實Rubyist」的書,我碰到這個表達來自於set.rb標準庫:將AND用作邏輯門是否被認爲是良好的做法?

enum.nil? and return

這似乎是一個奇怪的(但聰明)的方式來做到這一點:

return unless enum.nil?

這是一種常用技術嗎?另外,爲什麼這樣呢?我錯過了什麼嗎?

下面是完整的代碼片段:

def initialize(enum = nil, &block) 
    @hash ||= Hash.new 

    enum.nil? and return 

    if block 
    do_with_enum(enum) { |o| add(block[o]) } 
    else 
    merge(enum) 
    end 
end 
+4

我以前沒見過,但當然是有效的。爲了可讀性,我更願意'返回除非..'。你可能會對這個問題提出反對意見,因爲它徵求意見,這對SO來說是不合理的。順便說一下,在這種情況下'&&'通常用來代替'和'。 –

+1

其次是可讀性問題。 ''和'是非常罕見的,它並沒有真正註冊爲條件語句乍一看'如果返回enum.nil?'或'return,除非枚舉'會。 @CarySwoveland - 我相信'和'(一個控制流操作符)在這個上下文中實際上比'&&'(布爾操作符)更適合**。 –

+0

@Zach,我同意你和'vs'和'&&',儘管許多Rubiest從不使用'和';只需'&&'根據需要帶括號。我上面的陳述表明,使用'&&'是「更好」,這是不正確的。 –

回答

1

Avdi Grimm's article在這個問題上,andor用於在紅寶石流量控制的運營商,而不是作爲布爾運算符的關鍵字。

您對,enum.nil? and returnreturn unless enum.nil?相同。我同意你的看法,在這種情況下使用unless會更具可讀性。

這種模式是不是紅寶石少見,它的完成這樣的原因是通過利用and運營商的低優先級的展現流量控制的意圖。由於該運算符的優先級較低,因此您可以添加更多與後續and鏈接的操作,而不會與在同一行代碼中執行的其他操作衝突。然而,大多數人會考慮用控制流量的最佳方式明確選擇一個條件。

+2

我現在明白了。我認爲'和'和'&&'是同義詞。 – Rick

相關問題