避免使用if语句:缩短代码

时间:2014-05-12 11:16:15

标签: ruby

我在https://gorails.com/blog/refactoring-if-statements观看了视频,但正在寻找一种更简洁的方法来避免使用多个if或case语句。 以下作品

            def process(input)
                commands = {
                    :q => Proc.new { puts "Goodbye" }, 
                    :tweet => Proc.new { puts "tweeting" }, 
                    :dm => Proc.new { puts "direct messaging"}, 
                    :help => Proc.new { puts "helping"}
                }
                commands[input.to_sym].call
            end

            process "tweet"

但我怎么能进一步缩短呢?我尝试了以下

            def process(input)
                commands = {
                    :q => { puts "Goodbye" }, 
                    :tweet => { puts "tweeting" }, 
                    :dm => { puts "direct messaging"}, 
                    :help => { puts "helping"}
                }
                commands[input.to_sym].to_proc.call
            end

            process "tweet"

然后我收到错误

            # syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '('
            #       :q => { puts "Goodbye" }, 
            #                     ^

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

使用lambda语法

def process(input)
  commands = {
    :q => ->{ puts "Goodbye" }, 
    :tweet => ->{ puts "tweeting" }, 
    :dm => ->{ puts "direct messaging"}, 
    :help => ->{ puts "helping"}
  }
  commands[input.to_sym].to_proc.call
end

process "tweet"

使用新的Hash语法可以进一步缩短这一点:

def process(input)
  {
    q: ->{ puts "Goodbye" }, 
    tweet: ->{ puts "tweeting" }, 
    dm: ->{ puts "direct messaging"}, 
    help: ->{ puts "helping"}
  }[input.to_sym].call
end

process "tweet"

答案 1 :(得分:2)

使用Kernel#proc

  

相当于Proc.new

def process(input)
  commands = {
    :q => proc { puts "Goodbye" }, 
    :tweet => proc { puts "tweeting" }, 
    :dm => proc { puts "direct messaging"}, 
    :help => proc { puts "helping"}
  }[input.to_sym].call
end

答案 2 :(得分:1)

我不确定您建议或我在此建议的内容是否会改善所讨论代码的优雅或可读性,但您可以使用散列访问器模式进一步缩短它,如下所示:

def process(input)
  commands = {
    :q => Proc.new { puts "Goodbye" }, 
    :tweet => Proc.new { puts "tweeting" }, 
    :dm => Proc.new { puts "direct messaging"}, 
    :help => Proc.new { puts "helping"}
  }[input.to_sym].call
end