2015-10-18 57 views
0

昨晚我在一个项目中遇到了这个问题,同时写了一个助手来根据文件扩展名选择一个图标,并且想知道是否有更好的(更“红宝石”)处理方法?有没有更好的方法来执行多个包含?红宝石选择?

的代码目前云一样的东西:

def choose_icon(myfile) 
    icon = "default-icon" 
    if ["*.doc","*.docx",".txt","*.dot"].include? File.extname(myfile) 
    icon = "doc-icon" 
    end 
    if ["*.xls","*.xlsx","*.xlt"].include? File.extname(myfile) 
    icon = "sheet-icon" 
    end 
    if ["*.mp3","*.aac","*.aiff","*.wav"].include? File.extname(myfile) 
    icon = "audio-icon" 
    end 
    if ["*.mov","*.m4a","*.wmv"].include? File.extname(myfile) 
    icon = "movie-icon" 
    end 
    icon # return the chosen icon 
end 

这在某种程度上感觉有点笨拙和不雅给我,我挣扎着寻找更好的方式来做到这一点的红宝石。

(注:上面的例子实在是简化和实际的代码是远远更长,看起来更加整洁了。)

这将是非常酷的,如果“情况”结构会像这样工作:

def choose_icon(myfile) 
    case File.extname(myfile) 
    when ["*.doc","*.docx",".txt","*.dot"].include? 
    "doc-icon" 
    when ["*.xls","*.xlsx","*.xlt"].include? 
    "sheet-icon" 
    when ["*.mp3","*.aac","*.aiff","*.wav"].include? 
    "audio-icon" 
    when ["*.mov","*.m4a","*.wmv"].include? 
    "movie-icon" 
    else 
    "default-icon" 
    end 
end 

但当然,这是行不通的。虽然阅读起来非常容易,但是我想知道是否我错过了一些其他方法来对一系列选项进行多重比较,这些选项将恢复我的代码的一些优雅和可读性?

回答

3

你几乎说得对。只是离开方括号和include?,它会工作。我认为星号不应该是必需的,因为File.extname只用一个点返回扩展名。

def choose_icon(myfile) 
    case File.extname(myfile) 
    when '.doc', '.docx', '.txt', '.dot' 
    'doc-icon' 
    when '.xls', '.xlsx', '.xlt' 
    'sheet-icon' 
    when '.mp3', '.aac', '.aiff', '.wav' 
    'audio-icon' 
    when '.mov', '.m4a', '.wmv' 
    'movie-icon' 
    else 
    'default-icon' 
    end 
end 
+0

哈!感谢你 - 不知何故,我已经完全忘记了我可以为每个这样的“时间”提供多个结果。感谢让我的代码再次优雅! ;) – CyberFerret

+1

@Cyber​​Ferret没问题。再次编辑是因为我认为星号不正确。 –

+0

更新:你对这个星号也是对的。我刚刚检查了我的实际代码,他们不在那里 - 我在今天早上手动重新输入了这段代码,经过长时间的编码,并放入星号,因为braindead! :D – CyberFerret

2

你可以使用一个哈希:

h = [*(%w| .doc .docx .txt .dot |).product(["doc-icon"]), 
    *(%w| .xls .xlsx .xlt  |).product(["sheet-icon"]), 
    *(%w| .aac .aiff .wav  |).product(["audio-icon"]), 
    *(%w| .mov .m4a .wmv  |).product(["movie-icon"])].to_h 
    #=> {".doc"=>"default-icon", ".docx"=>"default-icon", 
    # ".txt"=>"default-icon", ".dot"=>"default-icon", 
    # ".xls"=>"sheet-icon" , ".xlsx"=>"sheet-icon", 
    # ".xlt"=>"sheet-icon" , ".aac"=>"audio-icon", 
    # ".aiff"=>"audio-icon" , ".wav"=>"audio-icon", 
    # ".mov"=>"movie-icon" , ".m4a"=>"movie-icon", 
    # ".wmv"=>"movie-icon"} 
h.default = "default-icon" 

h[File.extname("myfile.wav")] 
    #=> "audio-icon" 
h[File.extname("./mydir/myfile.abc")] 
    #=> "default-icon" 
+0

不错 - 我从来没有深入研究过哈希,所以根本不知道它们可能是如此强大。我想,还有一些进一步的调查。 – CyberFerret