代码之家  ›  专栏  ›  技术社区  ›  Wylliam Judd

如何按条件排除未使用的案例[已关闭]

  •  3
  • Wylliam Judd  · 技术社区  · 9 年前

    哪个更好?

    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语句似乎很尴尬,但它似乎也比用除非更深入一些。

    有更好的方法来编写此代码。我不知道默认的Hash值,这会清理代码很多,但我仍然想知道哪一个更好:没有正文的if语句,或者除非,或者其他什么。

    2 回复  |  直到 9 年前
        1
  •  1
  •   Martin Konecny    9 年前

    这可能是最好的:

    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 声明。比起花哨的代码,拥有更多可读的代码几乎总是更可取的。

        2
  •  1
  •   Kevin Sylvestre    9 年前

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

    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
      }