簡體   English   中英

有沒有更優雅的方法來執行多重包含? 選擇紅寶石?

[英]Is there a more elegant way to perform a multiple include? selection in ruby?

我昨晚在一個項目中遇到了這個問題,當時我寫了一個幫助程序來根據文件擴展名選擇圖標,並且想知道是否有更好的(更“紅寶石”)處理方式?

該代碼當前類似於:

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

這在某種程度上讓我感到笨拙和笨拙,而我一直在努力尋找在Ruby中實現此目標的更好方法。

(注意:上面的示例已真正簡化,實際代碼更長,看起來更加混亂。)

如果' case '構造像這樣工作,那將真的很酷:

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

但是,當然不行。 但是,它更容易閱讀,所以我想知道是否錯過了其他一些與選項集合進行多重比較的方法,這些選項將使我的代碼恢復一些優雅和可讀性嗎?

你幾乎是對的。 只需刪除方括號和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

您可以使用哈希:

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" 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM