Ruby 如果满足条件,则在字符串插值中添加子字符串
我得到了一个数组,并且必须根据元素的不同,用空格连接与每个元素对应的某些项:Ruby 如果满足条件,则在字符串插值中添加子字符串,ruby,literals,Ruby,Literals,我得到了一个数组,并且必须根据元素的不同,用空格连接与每个元素对应的某些项: 如果元素是字符串string或形式为[string]的数组,则在输出中包括string 如果元素是[string1,string2]格式的数组,则如果string1长度超过一个字符,则在输出中包括“--string1”,否则包括“-string1”。然后在结果中包括“string2” 所以[“猫”,“狗”,“鱼”,“牛”]将输出“猫-狗-鱼-牛”,[“猫”,“蝙蝠”],“鼠标”]将输出“-蝙蝠鼠标” 其他人编写了以下代
string
或形式为[string]
的数组,则在输出中包括string
[string1,string2]
格式的数组,则如果string1
长度超过一个字符,则在输出中包括“--string1”
,否则包括“-string1”
。然后在结果中包括“string2”
[“猫”,“狗”,“鱼”,“牛”]
将输出“猫-狗-鱼-牛”
,[“猫”,“蝙蝠”],“鼠标”]
将输出“-蝙蝠鼠标”
其他人编写了以下代码:
def args_to_string args
args.map{ |i,j| j ? "#{?-if i[1]}-#{i} #{j}" : i}*" "
end
- 我理解,最后的splat
表示块只接收一个参数是可以的,在这种情况下将是*
nil
- 然后有一个三元if-Then语句。下一行:
如果"#{?-if i[1]}-#{i} #{j}"
有第二个字符,我想会包含一个额外的连字符i
- 这个
中的大括号之间可以放什么?如何仅在满足条件时才包含特定字符串{}
- 在上面的例子中,为什么连字符前面有一个问号
Array*
带字符串参数与join
相同
如何仅在满足条件时才包含特定字符串
你喜欢这样做:
"#{"foo" if some_contition}"
它实际上在代码中用作#{?-if i[1]}
为什么连字符前面有问号
保存字符。它是单个字符串的文本<代码>?-相当于“-”
简而言之,请阅读手册。让我们试着逐步完成计算
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
的第一个元素被传递给块,块变量的值通过并行(或多重)赋值确定:
所以“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”
“cow”
被映射到“cow”
因此,我们完成了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"
因为是“相当于
ari.join(str)
”在向下滚动查看图标之前,我可以通过长度来告诉你答案。@sawa,只有当它是我的一个血淋淋的详细答案时,它才是主要为Ruby新手保留的。
enum.next
#=>StopIteration: iteration reached an end
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"