2014-05-12 109 views
0

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

  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" }, 
      #     ^

任何建议吗?

+1

,如果你想摆脱Proc.new你既可以使用lambda(stabby lambda语法:' - > {放“goodbye”}')或者使用proc方法'proc {puts“goodbye”}' –

回答

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

'lambda'和'proc'不一样。 –

+0

@PhilidorGreen正确,但它们在本用例中服务于相同的目的 - “避免使用if语句” –

+0

很好,不知道这个lambda语法 – peter

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 
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