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)
那是因为 STANDARD
和 ELSE
的图像大小相同。
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_SIZE
、SUPERFINE && pdf_size != LEGAL_PDF_SIZE
、FINE && pdf_size == LEGAL_PDF_SIZE
和 SUPERFINE && pdf_size == LEGAL_PDF_SIZE
都是布尔值,但 resolution
是 String
, 所以他们永远不会匹配。
[STANDARD, (pdf_size === LEGAL_PDF_SIZE)]
是一个 Array
。 Array
永远不会匹配 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
我有一个 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)
那是因为 STANDARD
和 ELSE
的图像大小相同。
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_SIZE
、SUPERFINE && pdf_size != LEGAL_PDF_SIZE
、FINE && pdf_size == LEGAL_PDF_SIZE
和 SUPERFINE && pdf_size == LEGAL_PDF_SIZE
都是布尔值,但 resolution
是 String
, 所以他们永远不会匹配。
[STANDARD, (pdf_size === LEGAL_PDF_SIZE)]
是一个 Array
。 Array
永远不会匹配 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