如果满足条件,则在字符串插值中添加子字符串

Add a substring within string interpolation if condition is met

我得到一个数组,必须根据元素用空格连接对应于每个元素的某些项目:

  1. 如果元素是字符串 string 或形式为 [string] 的数组,请在输出中包含 string
  2. 如果元素是 [string1, string2] 形式的数组,则如果 string1 长于一个字符,则在输出中包含 "--string1",否则 "-string1"。然后在结果中包含 "string2"

所以["cat",["dog","fish"],["cow"]]会输出"cat --dog fish cow"[["a","bat"],"mouse"]会输出"-a bat mouse".

别人写了下面的代码:

def args_to_string args
  args.map{ |i,j| j ? "#{?-if i[1]}-#{i} #{j}" : i}*" "
end

the splat * at the end means that it's okay for the block just to receive one parameter

没有。 Array#* 与字符串参数相同 join.

How do I include a specific string only if a condition is met?

你这样做:

"#{"foo" if some_contition}"

在代码中实际使用为#{?-if i[1]}

why does the hyphen have a question mark in front of it?

保存字符。它是单个字符串的文字。 ?- 等同于 "-".

总之,请阅读说明书。

让我们尝试逐步完成计算。

args = ["cat", ["dog","fish"], ["cow"]]

有效线路为

args.map { |i,j| j ? "#{ ?- if i[1] }-#{ i } #{ j }" : i } * " "

让我们分解一下。

enum = args.map
  #=> #<Enumerator: ["cat", ["dog", "fish"], ["cow"]]:map> 

我们可以将此枚举器转换为数组,查看它将传递给块的三个元素。

enum.to_a
  #=> ["cat", ["dog", "fish"], ["cow"]] 

enum的第一个元素被传递给块,块变量的值使用并行(或多重)赋值:

i,j = enum.next
  #=> "cat"
i #=> "cat"
j #=> nil

str = "#{ ?- if i[1] }-#{ i } #{ j }"
  #=> "#{ "-" if "a" }-cat "   Note "#{ nil }" => "" 
  #=> "--cat "    
j ? str : i
  #=> nil ? "--cat " : "cat"
  #=> "cat"

所以 "cat" 映射到 "cat"

注意 i[1] => nili 是单字符字符串时,虽然示例中没有使用它,但它很重要。接下来,将 enum 的第二个元素传递给块。

i,j = enum.next
  #=> ["dog", "fish"] 
i #=> "dog" 
j #=> #=> "fish" 
str = "#{ ?- if i[1] }-#{ i } #{ j }"
  #=> "#{ "-" if "o" }-dog fish"
  #=> "--dog fish" 
j ? str : i
  #=> "fish" ? "--dog fish" : "dog"
  #=> "--dog fish"

["dog", "fish"] 因此映射到 "--dog fish".

i,j = enum.next
  #=> ["cow"] 
i #=> "cow" 
j #=> nil 
str = "#{ ? - if i[1] }-#{ i } #{ j }"
  #=> "#{ "-" if "o" }-cow "
  #=> "--cow " 
j ? str : i
  #=> nil ? "--cow " : "cow 
  #=> "cow" 

"cow" 映射到 "cow".

enum.next
  #=>StopIteration: iteration reached an end

所以我们完成了 map。我已经展示了

a = enum.each { |i,j| j ? "#{?-if i[1]}-#{i} #{j}" : i}
  #=> ["cat", "--dog fish", "cow"]

这是怎么回事

args.map{ |i,j| j ? "#{?-if i[1]}-#{i} #{j}" : i}
  #=> ["cat", "--dog fish", "cow"]

已实施。最后一步是

a * " "
  #=> a.join(" ")
  #=> "cat --dog fish cow"

因为 Array#* 是 "equivalent to ary.join(str)"。