如何按条件排除未使用的案例

How to exclude an unused case by conditions

哪个更好?

string.each_char do |letter|
    unless letter == " "
        if letters.has_key?(letter)
            letters[letter] = letters[letter].next
        else
            letters[letter] = 1
        end
    end
end

string.each_char do |letter|
    if letter == " "
    elsif letters.has_key?(letter)
        letters[letter] = letters[letter].next
    else
        letters[letter] = 1
    end
end

如果 if 语句没有主体似乎很尴尬,但似乎也比使用 unless 更深入一步更可取。

有更好的方法来编写这段代码。我不知道默认哈希值,这会清理这段代码很多,但我仍然想知道哪个更可取:没有正文的 if 语句,或 unless,或其他东西。

这可能是最好的:

letters = Hash.new(0)
string = "aaabbc"
string.each_char do |letter|
    if letter != " "
        letters[letter] += 1
    end
end
# => {"a"=>3, "b"=>2, "c"=>1}

为了在您的两个示例之间做出决定,我会避免添加 extra-depth(更多缩进)。第二个也更容易阅读,因为跟随一串 if/else 语句很简单。拥有比花哨的代码更易读的代码几乎总是更可取。

构造时可以设置hash的默认值:

letters = Hash.new(0)
...
letters[letter] = letters[letter].next

一个有趣的使用方法是使用 Ruby 提供的一些 map/reduce 方法:

letters = string.chars
  .reject{ |letter| letter == " " }
  .each_with_object(Hash.new(0)) { |letter, memo| 
    memo[letter] = memo[letter].next
  }