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

时间:2016-01-17 05:49:07

标签: ruby if-statement coding-style conditional-statements conventions

哪个更好?

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语句似乎很尴尬,但除非你更深入一步,似乎也更好。

这是编写此代码的更好方法。我不知道默认的哈希值,这会清理这个代码很多,但我仍然想知道哪个更好:没有正文的if语句,或者除非,或者别的。

2 个答案:

答案 0 :(得分:1)

这可能是最好的:

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

为了决定你的两个例子,我会避免增加额外的深度(更多的缩进)。第二个也更容易阅读,因为遵循一串if/else语句很简单。与花哨的代码相比,拥有更易读的代码几乎总是更可取。

答案 1 :(得分:1)

您可以在构造时设置哈希的默认值:

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
  }