如果满足条件,则在字符串插值中添加子字符串
Add a substring within string interpolation if condition is met
我得到一个数组,必须根据元素用空格连接对应于每个元素的某些项目:
- 如果元素是字符串
string
或形式为 [string]
的数组,请在输出中包含 string
。
- 如果元素是
[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
- 我理解最后的拼音
*
意味着块只接收一个参数是可以的,并且在这种情况下将是 nil
。
然后是三元if-then语句。下一行:
"#{?-if i[1]}-#{i} #{j}"
我认为 如果 i
有第二个字符,则包含一个额外的连字符。
- 这个
#{}
中的括号之间可以插入什么?如何仅在满足条件时包含特定字符串?
- 而在上面的例子中,为什么连字符前面有一个问号?
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] => nil
当 i
是单字符字符串时,虽然示例中没有使用它,但它很重要。接下来,将 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)
"。
我得到一个数组,必须根据元素用空格连接对应于每个元素的某些项目:
- 如果元素是字符串
string
或形式为[string]
的数组,请在输出中包含string
。 - 如果元素是
[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
- 我理解最后的拼音
*
意味着块只接收一个参数是可以的,并且在这种情况下将是nil
。 然后是三元if-then语句。下一行:
我认为"#{?-if i[1]}-#{i} #{j}"
如果
i
有第二个字符,则包含一个额外的连字符。- 这个
#{}
中的括号之间可以插入什么?如何仅在满足条件时包含特定字符串? - 而在上面的例子中,为什么连字符前面有一个问号?
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] => nil
当 i
是单字符字符串时,虽然示例中没有使用它,但它很重要。接下来,将 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)
"。