Ruby 具有多个条件的案例陈述

Ruby Case Statements with Multiple conditions

我有一个 returns 图像大小基于用户选择的方法,现在我想在我的案例陈述中添加另一个条件。当我在系统调用执行 pdfinfo 后再次调用该方法时,它没有设置正确的图像大小,如果用户选择 STANDARD 它应该是 1250x1075 但它甚至没有做我的案例陈述, 它直接转到 else 并设置 1728x1075

这是我试过的

205   def FaxCall.set_image_size(resolution, pdf_size=nil)
206     case resolution
207     when STANDARD && (pdf_size != LEGAL_PDF_SIZE)]
208       image="1728x1075"
209     when FINE && pdf_size != LEGAL_PDF_SIZE
210       image="1728x2150"
211     when SUPERFINE && pdf_size != LEGAL_PDF_SIZE
212       image="1728x4300"
213     when [STANDARD, (pdf_size === LEGAL_PDF_SIZE)]
214       image="1250x1720"
215     when FINE && pdf_size == LEGAL_PDF_SIZE
216       image="1700x2800"
217     when SUPERFINE && pdf_size == LEGAL_PDF_SIZE
218       image="3400x5572"
219     else
220       image="1728x1075"
221     end
222     return image
223   end

这是我调用方法的地方

135    def FaxCall.prepare_doc(in_file,out_file,res=STANDARD)
139     image = FaxCall.set_image_size(res)
140     res = STANDARD unless RESOLUTION_OPTIONS.values.include?(res)
145       if ext.eql?("pdf")
146         pdf_size = `pdfinfo "#{in_file}"  | grep 'Page size:'`.gsub(/Page size:\s*\b/, '').chomp
147         if pdf_size == LEGAL_PDF_SIZE
148           image = FaxCall.set_image_size(res,pdf_size)

那是因为 STANDARDELSE 的图像大小相同。

207     when STANDARD && (pdf_size != LEGAL_PDF_SIZE)]
208       image="1728x1075"
219     else
220       image="1728x1075"

明白我的意思了吗?

我会创建一个哈希数组...

RES_MAP = [{res: STANDARD, legal: false, image: "1728x1075"},
  {res: FINE, legal: false , image: "1728x2150"},
  {res: SUPERFINE, legal: false , image: "1728x4300"},
  {res: STANDARD, legal: true, image: "1250x1720"},
  {res: FINE, legal: true , image: "1700x2800"},
  {res: SUPERFINE, legal: true , image: "3400x5572"}]

然后更改 FaxCall.set_image_size(resolution, pdf_size=nil) 以查找匹配的哈希并获取图像大小。

def FaxCall.set_image_size(resolution, pdf_size)
  is_legal = (pdf_size == LEGAL_PDF_SIZE)
  match_res = RES_MAP.select{ |r| r[:res] == resolution && r[:legal] == is_legal}.first
  return match_res.present? : match_res[:image] ? "1728x1075"
end

更易于阅读和添加更多地图值和额外条件。

STANDARD && (pdf_size != LEGAL_PDF_SIZE)FINE && pdf_size != LEGAL_PDF_SIZESUPERFINE && pdf_size != LEGAL_PDF_SIZEFINE && pdf_size == LEGAL_PDF_SIZESUPERFINE && pdf_size == LEGAL_PDF_SIZE 都是布尔值,但 resolutionString, 所以他们永远不会匹配。

[STANDARD, (pdf_size === LEGAL_PDF_SIZE)] 是一个 ArrayArray 永远不会匹配 String.

因此,您的 none 个案例将永远匹配,而您将始终属于 else 个案例。

@Jörg 已经解释了您的代码的问题。您可以考虑按如下方式编写您的方法。

DEFAULT_IMAGE_SIZE = "1728x1075"

def FaxCall.set_image_size(resolution, pdf_size=nil)
  case pdf_size
  when LEGAL_PDF_SIZE
    case resolution
    when STANDARD  then "1250x1720"
    when FINE      then "1700x2800"
    when SUPERFINE then "3400x5572"
    else                DEFAULT_IMAGE_SIZE
    end
  else
    case resolution
    when STANDARD  then "1728x1075"
    when FINE      then "1728x2150"
    when SUPERFINE then "1728x4300"
    else                DEFAULT_IMAGE_SIZE
    end
  end
end